Analysieren von Zeichenfolgen für Datum und Uhrzeit in .NET
Das Analysieren von Zeichenfolgen für die Konvertierung in DateTime-Objekte erfordert spezifische Informationen dazu, wie die Datums- und Uhrzeitangaben als Text dargestellt werden. Verschiedene Kulturen verwenden unterschiedliche Reihenfolgen für Tag, Monat und Jahr. Einige Zeitdarstellungen verwenden ein 24-Stunden-Format, andere hingegen geben „AM“ und „PM“ an. Einige Anwendungen benötigen nur das Datum. Für andere ist ausschließlich die Uhrzeit erforderlich. Für wieder andere Anwendungen müssen sowohl Datum als auch Uhrzeit angegeben werden. Die Methoden zum Konvertieren von Zeichenfolgen in DateTime-Objekte ermöglichen es Ihnen, detaillierte Informationen zu den erwarteten Formaten und den Datums- und Uhrzeitelementen anzugeben, die für Ihre Anwendung benötigt werden. Es gibt drei Unteraufgaben zum ordnungsgemäßen Konvertieren von Text in ein DateTime-Objekt:
- Sie müssen das erwartete Format für den Text angeben, mit dem ein Datum und eine Uhrzeit repräsentiert werden.
- Sie können die Kultur für das Format eines Datums-/Uhrzeitwerts angeben.
- Sie können angeben, wie fehlende Komponenten in der Textdarstellung in Datum und Uhrzeit festgelegt werden.
Die Methoden Parse und TryParse ermöglichen eine Konvertierung zahlreicher gängiger Darstellungen von Datum und Uhrzeit. Die Methoden ParseExact und TryParseExact konvertieren eine Zeichenfolgendarstellung entsprechend dem Muster, das durch eine Formatzeichenfolge für Datum und Uhrzeit angegeben wird. Weitere Informationen hierzu finden Sie in den Artikeln Standard-Formatzeichenfolgen für Datum und Uhrzeit und Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit.
Das aktuelle DateTimeFormatInfo-Objekt bietet mehr Kontrolle darüber, wie der Text als Datum und Uhrzeit interpretiert werden soll. Die Eigenschaften eines DateTimeFormatInfo-Objekts beschreiben die Trennzeichen für Datum und Uhrzeit, die Namen von Monaten, Tagen und Zeiträumen sowie das Format der Bezeichnungen „AM“ und „PM“. Die von CultureInfo.CurrentCulture zurückgegebene CultureInfo verfügt über eine CultureInfo.DateTimeFormat-Eigenschaft, die die aktuelle Kultur darstellt. Wenn Sie eine bestimmte Kultur oder benutzerdefinierte Einstellungen verwenden möchten, geben Sie den Parameter IFormatProvider einer Analysemethode an. Geben Sie für den IFormatProvider-Parameter ein CultureInfo-Objekt an, das eine Kultur darstellt, oder ein DateTimeFormatInfo-Objekt.
In Text zur Darstellung eines Datums oder einer Uhrzeit fehlen möglicherweise Informationen. Beispielsweise würden die meisten Personen annehmen, dass mit „12. März“ das aktuelle Jahr gemeint ist. Ebenso repräsentiert „März 2018“ den Monat März im Jahr 2018. Text zur Darstellung einer Uhrzeit enthält häufig nur die Stunden und Minuten sowie eine AM/PM-Bezeichnung. Analysemethoden verarbeiten diese fehlenden Informationen, indem sie geeignete Standardwerte verwenden:
- Wenn nur die Uhrzeit vorhanden ist, wird für den Datumsteil das aktuelle Datum verwendet.
- Wenn nur das Datum vorhanden ist, wird für den Uhrzeitteil Mitternacht verwendet.
- Wenn in einem Datum kein Jahr angegeben ist, wird das aktuelle Jahr verwendet.
- Wenn kein Tag des Monats angegeben ist, wird der erste Tag des Monats verwendet.
Wenn das Datum in der Zeichenfolge enthalten ist, muss es den Monat und einen Tag oder ein Jahr enthalten. Wenn die Uhrzeit enthalten ist, muss die Stundenangabe und entweder eine Minutenangabe oder die Bezeichnung „AM/PM“ enthalten sein.
Sie können die Konstante NoCurrentDateDefault angeben, um diese Standardeinstellungen außer Kraft zu setzen. Wenn Sie diese Konstante verwenden, werden alle fehlenden Eigenschaften für Jahr, Monat oder Tag auf den Wert 1
festgelegt. Dieses Verhalten wird im letzten Beispiel durch die Verwendung von Parse veranschaulicht.
Zusätzlich zu einer Datums- und Zeitkomponente kann die Zeichenfolgendarstellung einer Datums- und Uhrzeitangabe einen Zeitraum enthalten, der angibt, um wie viel die Zeit von der koordinierten Weltzeit (UTC) abweicht. Beispielsweise definiert die Zeichenfolge „2/14/2007 5:32:00 -7:00“ eine Uhrzeit, die sieben Stunden vor UTC liegt. Wenn die Abweichung in der Zeichenfolgendarstellung einer Uhrzeit fehlt, gibt die Analyse ein DateTime-Objekt zurück, dessen Kind-Eigenschaft auf DateTimeKind.Unspecified festgelegt ist. Wird ein Versatz (Offset) angegeben, gibt die Analyse ein DateTime-Objekt zurück, dessen Kind-Eigenschaft auf DateTimeKind.Local festgelegt ist. Der Wert wird auch an die lokale Zeitzone Ihres Computers angepasst. Sie können dieses Verhalten ändern, indem Sie einen DateTimeStyles-Wert mit der Analysemethode verwenden.
Der Formatanbieter wird auch zum Interpretieren mehrdeutiger numerischer Datumsangaben verwendet. Es ist nicht eindeutig zu erkennen, welche Komponenten des in der Zeichenfolge „02/03/04“ dargestellten Datums für den Monat, den Tag und das Jahr stehen. Die Komponenten werden entsprechend der Reihenfolge ähnlicher Datumsformate im Formatanbieter interpretiert.
Parse
Das folgende Codebeispiel veranschaulicht die Verwendung der DateTime.Parse-Methode zum Konvertieren eines string
-Werts in ein DateTime-Objekt. In diesem Beispiel wird die dem aktuellen Thread zugeordnete Kultur verwendet. Wenn die der aktuellen Kultur zugeordnete CultureInfo die Eingabezeichenfolge nicht analysieren kann, wird eine FormatException ausgelöst.
Tipp
Alle C#-Beispiele in diesem Artikel werden in Ihrem Browser ausgeführt. Klicken Sie auf die Schaltfläche Ausführen, um die Ausgabe anzuzeigen. Sie können auch Bearbeitungen vornehmen, um ein wenig zu experimentieren.
Hinweis
Diese Beispiele sind im GitHub-docs-Repository sowohl für C# als auch für Visual Basic verfügbar.
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
Sie können beim Analysieren einer Zeichenfolge auch explizit die Kultur angeben, deren Formatierungskonventionen verwendet werden sollen. Sie geben eines der DateTimeFormatInfo-Standardobjekte an, die von der Eigenschaft CultureInfo.DateTimeFormat zurückgegeben werden. Im folgenden Beispiel wird ein Formatanbieter verwendet, um eine deutsche Zeichenfolge zu analysieren und in ein DateTime-Objekt zu konvertieren. Es wird ein CultureInfo-Objekt erstellt, das die Kultur de-DE
darstellt. Dieses CultureInfo
-Objekt sorgt für eine erfolgreiche Analyse der Zeichenfolge. Durch diesen Prozess wird jegliche Einstellung in der CurrentCulture des CurrentThread ausgeschlossen.
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
Sie können jedoch Überladungen der Parse-Methode zur Angabe benutzerdefinierter Formatanbieter verwenden. Die Parse-Methode unterstützt keine Analyse von Formaten, die nicht dem Standard entsprechen. Um ein Datum und eine Uhrzeit in einem nicht dem Standard entsprechenden Format zu analysieren, verwenden Sie stattdessen die ParseExact-Methode.
Im folgenden Codebeispiel wird anhand der DateTimeStyles-Enumeration angegeben, dass die aktuellen Datums- und Uhrzeitinformationen für nicht angegebene Felder dem DateTime-Objekt nicht hinzugefügt werden sollen.
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
Die Methode DateTime.ParseExact konvertiert eine Zeichenfolge in ein DateTime-Objekt, wenn es einem der angegebenen Zeichenfolgenmuster entspricht. Wird eine Zeichenfolge an diese Methode übergeben, die keinem der angegebenen Formate entspricht, wird eine FormatException ausgelöst. Sie können einen der Standardformatbezeichner für Datum und Uhrzeit oder eine Kombination der benutzerdefinierten Formatbezeichner angeben. Mithilfe der benutzerdefinierten Formatspezifizierer können Sie eine benutzerdefinierte Erkennungszeichenfolge erstellen. Erläuterungen zu den Spezifizierern finden Sie in den Artikeln Standardformatzeichenfolgen für Datum und Uhrzeit und Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit.
Im folgenden Codebeispiel wird die DateTime.ParseExact-Methode an ein zu analysierendes Zeichenfolgenobjekt übergeben, gefolgt von einem Formatbezeichner und einem CultureInfo-Objekt. Diese ParseExact-Methode kann nur Zeichenfolgen analysieren, die dem langen Datumsmuster in der Kultur en-US
entsprechen.
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
Jede Überladung der Methode Parse und ParseExact umfasst auch einen IFormatProvider-Parameter, der kulturspezifische Informationen zur Formatierung der Zeichenfolge enthält. In der Regel handelt es sich bei dem IFormatProvider-Objekt um ein CultureInfo-Objekt, das eine Standardkultur oder ein von der Eigenschaft DateTimeFormatInfo zurückgegebenes CultureInfo.DateTimeFormat-Objekt darstellt. ParseExact verwendet außerdem ein zusätzliches Zeichenfolgen- oder Zeichenfolgenarrayargument, mit dem mindestens ein benutzerdefiniertes Datums- und Uhrzeitformat definiert wird.