C # / .NET - przekonwertowanie iso 8601 na DateTime
ISO 8601 precyzuje różne formaty daty i czasu. W C # / .NET można przekonwertować ciąg iso 8601 na obiekt DateTime
na kilka sposobów.
Szybkie rozwiązanie:
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));
}
}
Spójrz poniżej, aby zobaczyć różne przykłady.
1. Przykład automatycznego wykrywania formatu
W tej sekcji przedstawiamy, jak wbudowana metoda radzi sobie z różnymi formatami daty i czasu.
Przedstawiony poniżej kod próbuje wykryć format daty i godziny i wyświetlić wynik w konsoli. Jak widać, niektóre formaty daty i godziny nie są obsługiwane w domyślnej konfiguracji, co było prezentowane jako tekst PARSING ERROR!
. Aby rozwiązać problem, możemy zdefiniować niestandardową listę obsługiwanych formatów i użyć ich do wykrycia formatu, jeśli wystąpił błąd - sprawdź przykład w następnej sekcji, aby zobaczyć, jak to działa.
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!"));
}
}
}
Uwaga:
do analizowania ciągu daty i godziny można również użyć metody
DateTime.Parse
, która zgłasza wyjątek, jeśli format jest nieprawidłowy lub nie jest obsługiwany.
Wynik:
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!
Uwaga:
data-czas są analizowane do wartości lokalnych, co zostało pokazane na wyjściu - tutaj znajdziesz więcej informacji na temat sufiksu Z.
2. Przykład formatu niestandardowego
Istnieją również inne sposoby używania niestandardowych formatów do analizowania ciągu daty i godziny.
Gdy domyślna analiza nie powiodła się i mamy pewność, że używamy poprawnego formatu daty i czasu, możemy zdefiniować dodatkowe przypadki, które są akceptowane.
Poniższe daty zostały skopiowane z powyższego przykładu - więc łatwo jest wykryć, że metoda Parse
nie jest obsługiwana .
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)));
}
}
}
Wynik:
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
Uwaga:
wartości data-czas są analizowane do czasu lokalnego, co zostało pokazane na wyjściu - tutaj znajdziesz więcej informacji na temat sufiksu Z.