C# – Analysieren einer DateTime-Zeichenfolge mit einem benutzerdefinierten Format

C# – Analysieren einer DateTime-Zeichenfolge mit einem benutzerdefinierten Format

In den meisten Fällen, wenn Sie eine Datetime-Zeichenfolge mit einem benutzerdefinierten Format parsen müssen, können Sie den Formatbezeichner übergeben und DateTime.TryParseExact() (oder ParseExact()) wie folgt verwenden:

public DateTime? ParseDate(string date)
{
	if (DateTime.TryParseExact(date, "M/d/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt))
	{
		return dt;
	}
	return null;
}
Code language: C# (cs)

Dies verwendet den Formatbezeichner „M/d/yyyy“.

  • M =1-2-stelliger Monat.
  • d =1-2-stelliger Tag.
  • yyyy =4-stelliges Jahr.

Der folgende Code verwendet diese Methode:

Console.WriteLine($"Parsed 1/1/2021 into {ParseDate("1/1/2021")}");
Console.WriteLine($"Parsed 01/01/2021 into {ParseDate("01/01/2021")}");
Code language: C# (cs)

Dies gibt Folgendes aus:

Parsed 1/1/2021 into 1/1/2021 12:00:00 AM
Parsed 01/01/2021 into 1/1/2021 12:00:00 AMCode language: plaintext (plaintext)

Beachten Sie, dass es in der Lage war, die Monate „1“ und „01“ zu verarbeiten, da „M“ ein Ziffernbezeichner für 1-2 Monate ist. Wenn Sie den Formatbezeichner übergeben, zeigt IntelliSense eine vollständige Liste möglicher Formatbezeichnerwerte und eine Beschreibung ihrer Funktion an (Hinweis:Ich verwende VS2019 ). Sie können sich auch auf dieser MSDN-Seite über alle möglichen Formatbezeichner informieren.

Parsen einer zweistelligen Jahreszahl

Wir alle wissen, dass es keine gute Idee ist, zweistellige Jahreszahlen zu verwenden. Wenn Sie ein zweistelliges Jahr verwenden, verlieren Sie Informationen und müssen erraten, welches vierstellige Jahr es darstellt.

Wenn Sie ein zweistelliges Jahr mit DateTime.ParseExact() parsen, verwendet es CultureInfo.Calendar.TwoDigitYearMax, um zu bestimmen, wie es in ein vierstelliges Jahr parsen soll. Der Standard-TwoDigitYearMax auf meinem System ist derzeit 2049. Sie können eine CultureInfo übergeben und TwoDigitYearMax auf einen beliebigen Wert setzen, der in Ihrem Szenario sinnvoll ist.

Hier ist ein Beispiel. Nehmen wir an, ich muss „9912“ in „yyMM“ parsen und weiß, dass ich es mit zukünftigen Daten im aktuellen Jahrhundert zu tun habe. Wenn ich es den Standardwert TwoDigitYearMax verwenden lasse, wird dies in „12/1/1999“ geparst. Ich möchte wirklich, dass es in „12/1/2099“ geparst wird, also muss ich TwoDigitYearMax=2100 setzen, wie folgt:

string date = "9912";

CultureInfo culture = new CultureInfo("en-US");
culture.Calendar.TwoDigitYearMax = 2100;

if (DateTime.TryParseExact(date, "yyMM", culture, DateTimeStyles.None, out DateTime dt))
{
	Console.WriteLine($"Parsed {date} into {dt}");
}
else
{
	Console.WriteLine($"Unable to parse {date}");
}
Code language: C# (cs)

Dies gibt Folgendes aus:

Parsed 9912 into 12/1/2099 12:00:00 AMCode language: plaintext (plaintext)

Das aktuelle Jahr ist 2021. Was ist, wenn ich davon ausgehen möchte, dass die zweistellige Jahreszahl immer mit dem aktuellen Jahr beginnt? Ich kann TwoDigitYearMax wie folgt auf das aktuelle Jahr + 99 setzen:

string date = "2112";

CultureInfo culture = new CultureInfo("en-US");
culture.Calendar.TwoDigitYearMax = DateTime.Now.Year + 99;

if (DateTime.TryParseExact(date, "yyMM", culture, DateTimeStyles.None, out DateTime dt))
{
	Console.WriteLine($"Parsed {date} into {dt}");
}
else
{
	Console.WriteLine($"Unable to parse {date}");
}
Code language: C# (cs)

Dies gibt Folgendes aus:

Parsed 2112 into 12/1/2021 12:00:00 AMCode language: plaintext (plaintext)

Umgang mit Unsicherheit bei einer zweistelligen Jahreszahl

In den obigen Beispielen erwähnte ich, dass ich wusste, dass ich es mit zukünftigen Daten zu tun hatte. Was ist, wenn Sie es mit Daten zu tun haben, die entweder in der Zukunft oder in der Vergangenheit liegen können oder einen Zeitraum von mehr als 100 Jahren haben?

Mir fallen zwei Beispiele ein:

  • Geburtsdaten
  • Ablaufdaten

Wenn Sie Daten mit Geburtsdaten mit zweistelligen Jahreszahlen parsen, können Sie nicht mit 100 %iger Sicherheit sagen, dass Sie die richtige vierstellige Jahreszahl erraten werden.

Angenommen, Sie erhalten das Geburtsdatum:„1.1.19“. Logischerweise werden alle Geburtsdaten in der Vergangenheit liegen, also könntest du TwoDigitYearMax =das aktuelle Jahr 2021 setzen. Aber dieses Geburtsdatum könnte realistischerweise entweder „1.1.1999“ oder „1.1.1919“ sein, da es definitiv gibt Menschen, die über 100 Jahre alt sind.

Wie würden Sie damit umgehen? Meine Empfehlung wäre, wann immer es Unsicherheiten gibt, lassen Sie die Ergebnisse von einer Person überprüfen und das Jahr bestätigen. Das ist das Problem mit zweistelligen Jahreszahlen – es besteht immer die Möglichkeit, dass Sie das falsche Jahr erraten haben.