Dátum- és idősztringek elemzése a .NET-ben
A sztringek objektummá alakításához DateTime meg kell adnia a dátumok és időpontok szövegként való ábrázolásának módját. A különböző kultúrák különböző megrendeléseket használnak nap, hónap és év szerint. Egyes időábrázolások 24 órás órát használnak, mások az "AM" és a "PM" értéket adják meg. Egyes alkalmazásoknak csak a dátumra van szükségük. Másoknak csak az idő kell. Másoknak azonban meg kell adniuk a dátumot és az időt is. A sztringeket objektumokká DateTime konvertáló metódusok lehetővé teszik, hogy részletes információkat nyújtson a várt formátumokról, valamint az alkalmazás által igényelt dátum és idő elemeiről. A szöveg DateTimehelyes átalakítása három altevékenységből áll:
- Meg kell adnia a dátumot és időt jelképező szöveg várt formátumát.
- Megadhatja a dátum időformátumának kulturális környezetét.
- Megadhatja, hogy a szövegábrázolás hiányzó összetevői hogyan legyenek beállítva a dátumban és az időpontban.
A Parse metódusok és TryParse a metódusok számos gyakori dátum- és időábrázolást alakítanak át. A ParseExact metódusok a dátum- és TryParseExact időformátum-sztring által megadott mintának megfelelő sztring-ábrázolásokat alakítják át. További információkért tekintse meg a szabványos dátum- és időformátum-sztringekről, valamint az egyéni dátum- és időformátum-sztringekről szóló cikkeket.
Az aktuális DateTimeFormatInfo objektum nagyobb mértékben szabályozza a szöveg dátumként és időként való értelmezését. A DateTimeFormatInfo tulajdonságok írják le a dátum- és időelválasztókat, a hónapok, napok és korok nevét, valamint az "AM" és a "PM" megjelölés formátumát. A CultureInfo visszaadott CultureInfo.CurrentCulture tulajdonság az CultureInfo.DateTimeFormat aktuális kultúrát képviseli. Ha egy adott kultúrát vagy egyéni beállításokat szeretne, adja meg az IFormatProvider elemzési módszer paraméterét. IFormatProvider A paraméterhez adjon meg egy CultureInfo objektumot, amely egy kultúrát vagy egy objektumot DateTimeFormatInfo jelöl.
Előfordulhat, hogy a dátumot vagy időt ábrázoló szövegből hiányzik néhány információ. A legtöbben például azt feltételezik, hogy a "Március 12" dátum az aktuális évet jelöli. Hasonlóképpen, a "2018. március" a 2018. évi márciusi hónap. Az időt jelképező szöveg gyakran csak órákat, perceket és am/PM megjelölést tartalmaz. Az elemzési módszerek ésszerű alapértelmezett beállításokkal kezelik ezt a hiányzó információt:
- Ha csak az idő jelenik meg, a dátumrész az aktuális dátumot használja.
- Ha csak a dátum van jelen, az időrész éjfél.
- Ha az év nincs megadva egy dátumban, a rendszer az aktuális évet használja.
- Ha nincs megadva a hónap napja, a rendszer a hónap első napját használja.
Ha a dátum szerepel a sztringben, annak tartalmaznia kell a hónapot és a nap vagy év egyikét. Ha az idő jelen van, annak tartalmaznia kell az órát, valamint a perceket vagy az AM/PM tervezőt.
Az alapértelmezett értékek felülbírálásához megadhatja az NoCurrentDateDefault állandót. Ha ezt az állandót használja, a hiányzó év-, hónap- vagy naptulajdonságok az értékre 1
lesznek állítva. Ezt a viselkedést az utolsó példaParse szemlélteti.
A dátum és az idő összetevő mellett a dátum és az idő sztring-ábrázolása olyan eltolást is tartalmazhat, amely azt jelzi, hogy az idő mennyiben tér el az egyezményes világidőtől (UTC). A "2007.02.14. 5:32:00 -7:00" sztring például az UTC-nél hét órával korábbi időpontot határoz meg. Ha egy idő sztring-ábrázolása nem tartalmaz eltolást, az elemzés egy DateTime objektumot ad vissza, amelynek tulajdonsága Kind a következő.DateTimeKind.Unspecified Ha eltolás van megadva, az elemzés egy DateTime objektumot ad vissza, amelynek tulajdonsága Kind a következőre DateTimeKind.Localvan állítva. Az érték a gép helyi időzónájához is igazodik. Ezt a viselkedést DateTimeStyles az elemzési módszerrel egy érték használatával módosíthatja.
A formátumszolgáltató egy nem egyértelmű numerikus dátum értelmezésére is használható. Nem világos, hogy a "02/03/04" sztring által képviselt dátum mely összetevői a hónap, a nap és az év. Az összetevőket a formátumszolgáltató hasonló dátumformátumainak sorrendje szerint értelmezi a rendszer.
Elemzés
Az alábbi példa azt mutatja be, hogy a DateTime.Parse metódus használatával átalakíthatók a string
metódusok DateTime. Ez a példa az aktuális szálhoz társított kultúrát használja. Ha az CultureInfo aktuális kulturális környezethez társított nem tudja elemezni a bemeneti sztringet, a rendszer egy FormatException értéket ad.
Tipp.
A cikkben szereplő összes C#-minta a böngészőben fut. A kimenet megtekintéséhez nyomja le a Futtatás gombot. Saját kísérletezéshez is szerkesztheti őket.
Feljegyzés
Ezek a példák a GitHub docs adattárában érhetők el c# és Visual Basic nyelven is.
string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
// 1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
' 1/1/2009 00:00:00
Explicit módon megadhatja azt a kultúrát is, amelynek formázási konvencióit sztring elemzésekor használja a rendszer. Megadhatja a tulajdonság által visszaadott standard DateTimeFormatInfo objektumok egyikét CultureInfo.DateTimeFormat . Az alábbi példa egy formátumszolgáltató használatával elemez egy német sztringet egy DateTime. Létrehoz egy a kultúrát CultureInfode-DE
jelképező képet. Ez az CultureInfo
objektum biztosítja az adott sztring sikeres elemzését. Ez a folyamat kizárja, hogy bármilyen beállítás szerepel a CurrentCultureCurrentThread.
var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
// 6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
' 6/12/2008 00:00:00
A metódus túlterhelésével Parse azonban egyéni formátumszolgáltatókat is megadhat. A Parse metódus nem támogatja a nem szabványos formátumok elemzését. Ha nem szabványos formátumban szeretné elemezni a dátumot és az időt, használja inkább a metódust ParseExact .
Az alábbi példa az DateTimeStyles enumerálással határozza meg, hogy az aktuális dátum- és időinformációk ne legyenek hozzáadva a DateTime meghatározatlan mezőkhöz.
var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
// 6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
' 6/12/2008 00:00:00
ParseExact
A DateTime.ParseExact metódus objektummá konvertál egy sztringet DateTime , ha az megfelel a megadott sztringminták egyikének. Ha a megadott űrlapok egyike sem egy sztringet ad át ehhez a metódushoz, a függvény egy FormatException karaktert ad vissza. Megadhatja a szabványos dátum- és időformátum-meghatározók egyikét, vagy az egyéni formátumjelölők kombinációját. Az egyéni formátumjelölők használatával egyéni felismerési sztringet hozhat létre. A kijelölők magyarázatát a standard dátum- és időformátum sztringjeiről, valamint az egyéni dátum- és időformátum-sztringekről szóló cikkekben talál.
A következő példában a DateTime.ParseExact metódus egy sztringobjektumot ad át az elemzéshez, majd egy formátumkijelölőt, majd egy CultureInfo objektumot. Ez a ParseExact módszer csak a hosszú dátummintát követő sztringeket elemezheti a en-US
kultúrában.
var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
try
{
var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
Console.WriteLine(dateTime);
}
catch (FormatException)
{
Console.WriteLine("Unable to parse '{0}'", dateString);
}
}
// The example displays the following output:
// Unable to parse ' Friday, April 10, 2009'
// 4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
Try
Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
MyCultureInfo)
Console.WriteLine(MyDateTime)
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'", dateString)
End Try
Next
' The example displays the following output:
' Unable to parse ' Friday, April 10, 2009'
' 4/10/2009 00:00:00
A metódusok és ParseExact metódusok Parse minden egyes túlterhelése rendelkezik egy IFormatProvider paraméterrel is, amely a sztring formázásával kapcsolatos kultúraspecifikus információkat nyújt. Az IFormatProvider objektum egy CultureInfo olyan objektum, amely egy standard kultúrát vagy egy DateTimeFormatInfo , a CultureInfo.DateTimeFormat tulajdonság által visszaadott objektumot jelöl. ParseExact egy további sztring- vagy sztringtömb argumentumot is használ, amely egy vagy több egyéni dátum- és időformátumot határoz meg.