C# / .NET - ISO 8601 in DateTime konvertieren
ISO 8601 präzisiert verschiedene Datums-und Uhrzeitformate. In C# / .NET ist es auf verschiedene Art und Weise möglich, ein ISO 8601 string in ein DateTime
Objekt zu konvertieren.
Schnelle Lösung:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
CultureInfo culture = CultureInfo.InvariantCulture;
string text = "2019-08-18T07:36:13+01:00";
DateTime time = DateTime.Parse(text, culture, DateTimeStyles.None);
Console.WriteLine(time.ToString(culture));
}
}
Unten befinden sich verschieden Beispiele dafür.
1. Beispiel für eine automatische Formaterkennung
In diesem Abschnitt wird gezeigt, wie die integrierte Methode mit unterschiedlichen Datums-und Uhrzeitformaten umgeht.
Der Code vom unten versucht, das Datums-und Uhrzeitformat zu ermitteln und das Ergebnis in der Konsole zu drucken. Wie man sehen kann, werden einige Datums-und Uhrzeitformate von der Standardkonfiguratio nicht unterstützt, was als PARSING ERROR!
Text dargestellt wird. Um dieses Problem zu lösen, kann man eine benutzerdefinierte Liste der unterstützten Formate definieren und diese verwenden, um das Format zu erkennen, wenn ein Fehler aufgetreten ist. Es lohnt sich folgende Beispiele überprüfen, um zu sehen, wie es funktioniert.
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
string[] dates = {
"2019-08-18T07:36:13.5344729+01:00",
"2019-08-18T07:36:13+01:00",
"2019-08-18T07:36:13+01",
"2019-08-18T07:36:13",
"2019-08-18T07:36+01:00",
"2019-08-18T07:36+01",
"2019-08-18T07:36",
"2019-08-18T07+01:00",
"2019-08-18T07+01",
"2019-08-18T07",
"2019-08-18",
"20190818T073613+01:00",
"20190818T073613+01",
"20190818T0736+01:00",
"20190818T0736+01",
"20190818T07+01:00",
"20190818T07+01",
"20190818T07",
"20190818",
"--08-18",
"2019-08-18T06:36:13Z",
"2019-08-18T06:36Z",
"2019-08-18T06Z",
"20190818T063613Z",
"20190818T0636Z",
"20190818T06Z"
};
CultureInfo culture = CultureInfo.InvariantCulture;
foreach (string entry in dates)
{
DateTime time;
if (DateTime.TryParse(entry, culture, DateTimeStyles.None, out time))
{
string text = time.ToString(culture);
Console.WriteLine(string.Format("{0, -35} {1}", entry, text));
}
else
Console.WriteLine(string.Format("{0, -35} {1}", entry, "PARSING ERROR!"));
}
}
}
Hinweis: Zum Parsen von Datums-und Uhrzeit Strings kann man auch die DateTime.Parse
Methode verwenden, die eine Ausnahme auslöst, wenn das Format falsch ist oder nicht unterstützt wird.
Ausgabe:
2019-08-18T07:36:13.5344729+01:00 08/18/2019 07:36:13
2019-08-18T07:36:13+01:00 08/18/2019 07:36:13
2019-08-18T07:36:13+01 08/18/2019 07:36:13
2019-08-18T07:36:13 08/18/2019 07:36:13
2019-08-18T07:36+01:00 08/18/2019 07:36:00
2019-08-18T07:36+01 08/18/2019 07:36:00
2019-08-18T07:36 08/18/2019 07:36:00
2019-08-18T07+01:00 PARSING ERROR!
2019-08-18T07+01 PARSING ERROR!
2019-08-18T07 PARSING ERROR!
2019-08-18 08/18/2019 00:00:00
20190818T073613+01:00 PARSING ERROR!
20190818T073613+01 PARSING ERROR!
20190818T0736+01:00 PARSING ERROR!
20190818T0736+01 PARSING ERROR!
20190818T07+01:00 PARSING ERROR!
20190818T07+01 PARSING ERROR!
20190818T07 PARSING ERROR!
20190818 PARSING ERROR!
--08-18 PARSING ERROR!
2019-08-18T06:36:13Z 08/18/2019 07:36:13
2019-08-18T06:36Z 08/18/2019 07:36:00
2019-08-18T06Z PARSING ERROR!
20190818T063613Z PARSING ERROR!
20190818T0636Z PARSING ERROR!
20190818T06Z PARSING ERROR!
2019-W34-0 PARSING ERROR!
2019-W34 PARSING ERROR!
2019-230 PARSING ERROR!
Hinweis: Date-time Werte werden nach der in der Ausgabe angezeigten Ortszeit analysiert. Weitere Informationen zum Suffix Z findet man hier.
2. Beispiel für ein benutzerdefiniertes Format
Es gibt auch andere Möglichkeiten, benutzerdefinierte Formate zum Parsen von Date-time String zu verwenden.
Wenn die Standardanalyse fehlgeschlagen ist und man sicher ist, dass das richtige Datums-und Uhrzeitformat verwendet wird, kann man auch zusätzliche Fälle definieren, die akzeptiert werden.
Die folgenden Daten wurden aus dem obigen Beispiel kopiert, sodass leicht zu erkennen ist, dass sie mit der Parse
Methode nicht unterstützt werden.
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
string[,] dates = {
// FORMAT TEXT
{ "yyyy-MM-ddTHH:mm:sszzz", "2019-08-18T07:36:13+01:00" },
{ "yyyy-MM-ddTHH:mm:sszz", "2019-08-18T07:36:13+01" },
{ "yyyy-MM-ddTHH:mm:ss", "2019-08-18T07:36:13" },
{ "yyyy-MM-ddTHH:mmzzz", "2019-08-18T07:36+01:00" },
{ "yyyy-MM-ddTHH:mmzz", "2019-08-18T07:36+01" },
{ "yyyy-MM-ddTHH:mm", "2019-08-18T07:36" },
{ "yyyy-MM-ddTHHzzz", "2019-08-18T07+01:00" },
{ "yyyy-MM-ddTHHzz", "2019-08-18T07+01" },
{ "yyyy-MM-ddTHH", "2019-08-18T07" },
{ "yyyy-MM-dd", "2019-08-18" },
{ "yyyyMMddTHHmmsszzz", "20190818T073613+01:00" },
{ "yyyyMMddTHHmmsszz", "20190818T073613+01" },
{ "yyyyMMddTHHmmzzz", "20190818T0736+01:00" },
{ "yyyyMMddTHHmmzz", "20190818T0736+01" },
{ "yyyyMMddTHHzzz", "20190818T07+01:00" },
{ "yyyyMMddTHHzz", "20190818T07+01" },
{ "yyyyMMddTHH", "20190818T07" },
{ "yyyyMMdd", "20190818" },
{ "--MM-dd", "--08-18" },
{ "yyyy-MM-ddTHH:mm:ssZ", "2019-08-18T06:36:13Z" },
{ "yyyy-MM-ddTHH:mmZ", "2019-08-18T06:36Z" },
{ "yyyy-MM-ddTHHZ", "2019-08-18T06Z" },
{ "yyyyMMddTHHmmssZ", "20190818T063613Z" },
{ "yyyyMMddTHHmmZ", "20190818T0636Z" },
{ "yyyyMMddTHHZ", "20190818T06Z" }
};
CultureInfo culture = CultureInfo.InvariantCulture;
int length = dates.GetLength(0);
for (int i = 0; i < length; ++i)
{
string format = dates[i, 0];
string text = dates[i, 1];
DateTime time = DateTime.ParseExact(text, format, culture, DateTimeStyles.None);
Console.WriteLine(string.Format("{0, -35} {1}", text, time.ToString(culture)));
}
}
}
Ausgabe:
2019-08-18T07:36:13+01:00 08/18/2019 07:36:13
2019-08-18T07:36:13+01 08/18/2019 07:36:13
2019-08-18T07:36:13 08/18/2019 07:36:13
2019-08-18T07:36+01:00 08/18/2019 07:36:00
2019-08-18T07:36+01 08/18/2019 07:36:00
2019-08-18T07:36 08/18/2019 07:36:00
2019-08-18T07+01:00 08/18/2019 07:00:00
2019-08-18T07+01 08/18/2019 07:00:00
2019-08-18T07 08/18/2019 07:00:00
2019-08-18 08/18/2019 00:00:00
20190818T073613+01:00 08/18/2019 07:36:13
20190818T073613+01 08/18/2019 07:36:13
20190818T0736+01:00 08/18/2019 07:36:00
20190818T0736+01 08/18/2019 07:36:00
20190818T07+01:00 08/18/2019 07:00:00
20190818T07+01 08/18/2019 07:00:00
20190818T07 08/18/2019 07:00:00
20190818 08/18/2019 00:00:00
--08-18 08/18/2019 00:00:00
2019-08-18T06:36:13Z 08/18/2019 07:36:13
2019-08-18T06:36Z 08/18/2019 07:36:00
2019-08-18T06Z 08/18/2019 07:00:00
20190818T063613Z 08/18/2019 07:36:13
20190818T0636Z 08/18/2019 07:36:00
20190818T06Z 08/18/2019 07:00:00
Hinweis: Date-time Werte werden nach der in der Ausgabe angezeigten Ortszeit analysiert. Weitere Informationen zum Suffix Z findet man hier.