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:

  1. 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).
  2. .ssspowinno trwać .fffmilisekundy.
  3. 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.ParseExactdo ISO8601 datetimes, wystarczy użyć DateTimeOffset„s Parsezamiast (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());