Analysieren von Zeichenfolgen für Datum und Uhrzeit in .NETParsing Date and Time Strings 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.Parsing strings to convert them to DateTime objects requires you to specify information about how the dates and times are represented as text. Verschiedene Kulturen verwenden unterschiedliche Reihenfolgen für Tag, Monat und Jahr.Different cultures use different orders for day, month, and year. Einige Uhrzeiten werden im 24-Stunden-Format dargestellt, andere verwenden Zusätze wie „AM“ und „PM“.Some time representations use a 24-hour clock, others specify "AM" and "PM." Einige Anwendungen erfordern nur das Datum.Some applications need only the date. Für andere ist ausschließlich die Uhrzeit erforderlich.Others need only the time. Für wieder andere Anwendungen muss sowohl das Datum als auch die Uhrzeit angegeben werden.Still others need to specify both the date and the time. 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.The methods that convert strings to DateTime objects enable you to provide detailed information about the formats you expect and the elements of a date and time your application needs. Es gibt drei Unteraufgaben zum ordnungsgemäßen Konvertieren von Text in ein DateTime-Objekt:There are three subtasks to correctly converting text into a DateTime:

  1. Sie müssen das erwartete Format für den Text angeben, mit dem ein Datum und eine Uhrzeit repräsentiert werden.You must specify the expected format of the text representing a date and time.
  2. Sie können die Kultur für das Format eines Datums-/Uhrzeitwerts angeben.You may specify the culture for the format of a date time.
  3. Sie können angeben, wie fehlende Komponenten in der Textdarstellung in Datum und Uhrzeit festgelegt werden.You may specify how missing components in the text representation are set in the date and time.

Die Methoden Parse und TryParse ermöglichen eine Konvertierung zahlreicher gängiger Darstellungen von Datum und Uhrzeit.The Parse and TryParse methods convert many common representations of a date and time. Die Methoden ParseExact und TryParseExact konvertieren eine Zeichenfolgendarstellung entsprechend dem Muster, das durch eine Formatzeichenfolge für Datum und Uhrzeit angegeben wird.The ParseExact and TryParseExact methods convert a string representation that conforms to the pattern specified by a date and time format string. (Ausführliche Informationen hierzu finden Sie in den Artikeln Standard-Formatzeichenfolgen für Datum und Uhrzeit und Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit.)(See the articles on standard date and time format strings and custom date and time format strings for details.)

Das aktuelle DateTimeFormatInfo-Objekt bietet mehr Kontrolle darüber, wie der Text als Datum und Uhrzeit interpretiert werden soll.The current DateTimeFormatInfo object provides more control over how text should be interpreted as a date and time. 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 Bezeichnung „AM“ und „PM“.Properties of a DateTimeFormatInfo describe the date and time separators, and the names of months, days, and eras, and the format for the "AM" and "PM" designations. Die aktuelle Threadkultur stellt ein DateTimeFormatInfo-Objekt bereit, das die aktuelle Kultur repräsentiert.The current thread culture provides a DateTimeFormatInfo that represents the current culture. Wenn Sie eine bestimmte Kultur oder benutzerdefinierte Einstellungen verwenden möchten, geben Sie den Parameter IFormatProvider einer Analysemethode an.If you want a specific culture or custom settings, you specify the IFormatProvider parameter of a parsing method. Geben Sie für den IFormatProvider-Parameter ein CultureInfo-Objekt an, das eine Kultur darstellt, oder ein DateTimeFormatInfo-Objekt.For the IFormatProvider parameter, specify a CultureInfo object, which represents a culture, or a DateTimeFormatInfo object.

Im Text zur Darstellung eines Datums oder einer Uhrzeit fehlen möglicherweise Informationen.The text representing a date or time may be missing some information. Beispielsweise würden die meisten Personen annehmen, dass mit „12. März“ das aktuelle Jahr gemeint ist.For example, most people would assume the date "March 12" represents the current year. Ebenso repräsentiert „März 2018“ den Monat März im Jahr 2018.Similarly, "March 2018" represents the month of March in the year 2018. Der Text zur Darstellung einer Uhrzeit enthält häufig nur die Stunden und Minuten sowie eine AM/PM-Bezeichnung.Text representing time often does only includes hours, minutes, and an AM/PM designation. Analysemethoden verarbeiten diese fehlenden Informationen, indem sie geeignete Standardwerte verwenden:Parsing methods handle this missing information by using reasonable defaults:

  • Wenn nur die Uhrzeit vorhanden ist, wird für den Datumsteil das aktuelle Datum verwendet.When only the time is present, the date portion uses the current date.
  • Wenn nur das Datum vorhanden ist, wird für den Uhrzeitteil Mitternacht verwendet.When only the date is present, the time portion is midnight.
  • Wenn in einem Datum kein Jahr angegeben ist, wird das aktuelle Jahr verwendet.When the year isn't specified in a date, the current year is used.
  • Wenn kein Tag des Monats angegeben ist, wird der erste Tag des Monats verwendet.When the day of the month isn't specified, the first of the month is used.

Wenn das Datum in der Zeichenfolge enthalten ist, muss es den Monat und einen Tag oder ein Jahr enthalten.If the date is present in the string, it must include the month and one of the day or year. Wenn die Uhrzeit enthalten ist, muss die Stundenangabe und entweder eine Minutenangabe oder die Bezeichnung „AM/PM“ enthalten sein.If the time is present, it must include the hour, and either the minutes or the AM/PM designator.

Sie können die Konstante NoCurrentDateDefault angeben, um diese Standardeinstellungen außer Kraft zu setzen.You can specify the NoCurrentDateDefault constant to override these defaults. Wenn Sie diese Konstante verwenden, werden alle fehlenden Eigenschaften für Jahr, Monat oder Tag auf den Wert 1 festgelegt.When you use that constant, any missing year, month, or day properties are set to the value 1. Dieses Verhalten wird im letzten Beispiel durch die Verwendung von Parse veranschaulicht.The last example using Parse demonstrates this behavior.

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.In addition to a date and a time component, the string representation of a date and time can include an offset that indicates how much the time differs from Coordinated Universal Time (UTC). Beispielsweise definiert die Zeichenfolge „2/14/2007 5:32:00 -7:00“ eine Uhrzeit, die sieben Stunden vor UTC liegt.For example, the string "2/14/2007 5:32:00 -7:00" defines a time that is seven hours earlier than UTC. 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.If an offset is omitted from the string representation of a time, parsing returns a DateTime object with its Kind property set to DateTimeKind.Unspecified. Wird eine Abweichung angegeben, gibt die Analyse ein DateTime-Objekt zurück, dessen Kind-Eigenschaft auf DateTimeKind.Local festgelegt ist und dessen Wert an die lokale Zeitzone des Computers angepasst wird.If an offset is specified, parsing returns a DateTime object with its Kind property set to DateTimeKind.Local and its value adjusted to the local time zone of your machine. Sie können dieses Verhalten ändern, indem Sie einen DateTimeStyles-Wert mit der Analysemethode verwenden.You can modify this behavior by using a DateTimeStyles value with the parsing method.

Der Formatanbieter wird auch zum Interpretieren mehrdeutiger numerischer Datumsangaben verwendet.The format provider is also used to interpret an ambiguous numeric date. 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.It is not clear which components of the date represented by the string "02/03/04" are the month, day, and year. Die Komponenten werden entsprechend der Reihenfolge ähnlicher Datumsformate im Formatanbieter interpretiert.The components are interpreted according to the order of similar date formats in the format provider.

ParseParse

Das folgende Codebeispiel veranschaulicht die Verwendung der DateTime.Parse-Methode zum Konvertieren eines string-Werts in ein DateTime-Objekt.The following example illustrates the use of the DateTime.Parse method to convert a string into a DateTime. In diesem Beispiel wird die dem aktuellen Thread zugeordnete Kultur verwendet.This example uses the culture associated with the current thread. Wenn die der aktuellen Kultur zugeordnete CultureInfo-Klasse nicht die Eingabezeichenfolge analysieren kann, wird eine FormatException ausgelöst.If the CultureInfo associated with the current culture cannot parse the input string, a FormatException is thrown.

Tipp

Alle C#-Beispiele in diesem Artikel werden in Ihrem Browser ausgeführt.All the C# samples in this article run in your browser. Klicken Sie auf die Schaltfläche Ausführen, um die Ausgabe anzuzeigen.Press the Run button to see the output. Sie können auch Bearbeitungen vornehmen, um ein wenig zu experimentieren.You can also edit them to experiment yourself.

Hinweis

Diese Beispiele sind im GitHub-docs-Repository sowohl für C# als auch für VB verfügbar.These examples are available in the GitHub docs repo for both C# and VB. Alternativ können Sie das Projekt als ZIP-Datei für C# und Visual Basic herunterladen.Or you can download the project as a zipfile for C# or VB.

string dateInput = "Jan 1, 2009";
DateTime parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 12:00:00 AM
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 12:00:00 AM

Sie können beim Analysieren einer Zeichenfolge auch explizit die Kultur angeben, deren Formatierungskonventionen verwendet werden sollen.You can also explicitly define the culture whose formatting conventions are used when you parse a string. Sie geben eines der DateTimeFormatInfo-Standardobjekte an, die von der Eigenschaft CultureInfo.DateTimeFormat zurückgegeben werden.You specify one of the standard DateTimeFormatInfo objects returned by the CultureInfo.DateTimeFormat property. Im folgenden Beispiel wird ein Formatanbieter verwendet, um eine deutsche Zeichenfolge zu analysieren und in ein DateTime-Objekt zu konvertieren.The following example uses a format provider to parse a German string into a DateTime. Es wird ein CultureInfo-Objekt erstellt, das die Kultur de-DE darstellt.It creates a CultureInfo representing the de-DE culture. Dieses CultureInfo-Objekt sorgt für eine erfolgreiche Analyse der Zeichenfolge.That CultureInfo object ensures successful parsing of this particular string. Hierdurch wird jegliche Einstellung in der CurrentCulture von CurrentThread ausgeschlossen.This precludes whatever setting is in the CurrentCulture of the CurrentThread.

CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);
Console.WriteLine(MyDateTime);
// The example displays the following output:
//       6/12/2008 12:00:00 AM
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 12:00:00 AM

Auch wenn Sie Überladungen der Parse-Methode zur Angabe benutzerdefinierter Formatanbieter verwenden können, bietet die Methode keine Unterstützung für das Analysieren von Formaten, die nicht dem Standard entsprechen.However, although you can use overloads of the Parse method to specify custom format providers, the method does not support parsing non-standard formats. Um ein Datum und eine Uhrzeit in einem nicht dem Standard entsprechenden Format zu analysieren, verwenden Sie stattdessen die ParseExact-Methode.To parse a date and time expressed in a non-standard format, use the ParseExact method instead.

Im folgenden Codebeispiel wird anhand der DateTimeStyles-Enumeration angegeben, dass die aktuellen Datums- und Uhrzeitinformationen nur für angegebene Felder dem DateTime-Objekt hinzugefügt werden sollen.The following example uses the DateTimeStyles enumeration to specify that the current date and time information should not be added to the DateTime for unspecified fields.

CultureInfo MyCultureInfo = new CultureInfo("de-DE");
string MyString = "12 Juni 2008";
DateTime MyDateTime = 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 12:00:00 AM
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 12:00:00 AM

ParseExactParseExact

Die Methode DateTime.ParseExact konvertiert eine Zeichenfolge in ein DateTime-Objekt, wenn es einem der angegebenen Zeichenfolgenmuster entspricht.The DateTime.ParseExact method converts a string to a DateTime object if it conforms to one of the specified string patterns. Wird eine Zeichenfolge an diese Methode übergeben, die nicht dem angegebenen Format entspricht, wird eine FormatException ausgelöst.When a string that is not one of the forms specified is passed to this method, a FormatException is thrown. Sie können einen der Standardformatbezeichner für Datum und Uhrzeit oder eine Kombination der benutzerdefinierten Formatbezeichner angeben.You can specify one of the standard date and time format specifiers or a combination of the custom format specifiers. Mithilfe der benutzerdefinierten Formatbezeichner können Sie eine benutzerdefinierte Erkennungszeichenfolge erstellen.Using the custom format specifiers, it is possible for you to construct a custom recognition string. Erläuterungen zu den Bezeichnern finden Sie in den Themen Standardformatzeichenfolgen für Datum und Uhrzeit und Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit.For an explanation of the specifiers, see the topics on standard date and time format strings and custom date and time format strings.

Im folgenden Codebeispiel wird die DateTime.ParseExact-Methode an ein zu analysierendes Zeichenfolgenobjekt übergeben, gefolgt von einem Formatbezeichner und einem CultureInfo-Objekt.In the following example, the DateTime.ParseExact method is passed a string object to parse, followed by a format specifier, followed by a CultureInfo object. Diese ParseExact-Methode kann nur Zeichenfolgen analysieren, die dem langen Datumsmuster in der Kultur en-US entsprechen.This ParseExact method can only parse strings that follow the long date pattern in the en-US culture.

CultureInfo MyCultureInfo = new CultureInfo("en-US");
string[] MyString = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in MyString)
{
    try
    {
        DateTime MyDateTime = DateTime.ParseExact(dateString, "D", MyCultureInfo);
        Console.WriteLine(MyDateTime);
    }
    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 12:00:00 AM
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 12:00:00 AM

Jede Überladung der Methode Parse und ParseExact umfasst auch einen IFormatProvider-Parameter, der kulturspezifische Informationen zur Formatierung der Zeichenfolge enthält.Each overload of the Parse and ParseExact methods also has an IFormatProvider parameter that provides culture-specific information about the formatting of the string. In der Regel handelt es sich bei diesem IFormatProvider-Objekt um ein CultureInfo-Objekt, das eine Standardkultur oder ein von der Eigenschaft DateTimeFormatInfo zurückgegebenes CultureInfo.DateTimeFormat-Objekt darstellt.This IFormatProvider object is a CultureInfo object that represents a standard culture or a DateTimeFormatInfo object that is returned by the CultureInfo.DateTimeFormat property. ParseExact verwendet außerdem ein zusätzliches Zeichenfolgen- oder Zeichenfolgenarrayargument, mit dem mindestens ein benutzerdefiniertes Datums- und Uhrzeitformat definiert wird.ParseExact also uses an additional string or string array argument that defines one or more custom date and time formats.

Siehe auchSee also