Ciąg nie został rozpoznany jako prawidłowy DateTime w ParseExact z milisekundami
Nov 23 2020
Mam datę w formacie ciągu, muszę przekonwertować ją na DateTime, to jest mój kod:
DateTime dt = DateTime.ParseExact("2018-04-09T09:27:07.247+02:00", "YYYY-MM-DDTHH:mm:ss.SSSZ", System.Globalization.CultureInfo.InvariantCulture).ToUniversalTime();
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")).ToString());
Działa z datą taką jak: 2020-08-27T00: 00: 00 + 02: 00, ale nie działa z datą taką jak ta w skrypcie z powodu milis. Jak zmienić wzór daty? Wypróbowałem wiele z nich, ale nie rozwiązałem.
Odpowiedzi
4 John Nov 23 2020 at 13:53
Z Twoim kodem są trzy problemy:
- W ciągach formatujących rozróżniana jest wielkość liter (rrrr oznacza rok 4-cyfrowy, RRRR nie, podobnie jak dd oznacza dzień 2-cyfrowy, a DD nie).
.sss
powinno trwać.fff
milisekundy.- Spodziewasz się Z (Zulu), ale tak naprawdę otrzymujesz przesunięcie czasowe („+02: 00”). Oznacza to, że ciąg formatu różni się od ciągu z datą i godziną.
Proponuję nie przejmuj się DateTime.ParseExact
do ISO8601 datetimes, wystarczy użyć DateTimeOffset
„s Parse
zamiast (który będzie przestrzegać przesunięcie czasowe i pracy z ISO8601 datetimes):
DateTimeOffset dt = DateTimeOffset.Parse("2018-04-09T09:27:07.247+02:00", System.Globalization.CultureInfo.InvariantCulture).ToUniversalTime();
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt.DateTime, TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time")).ToString());