La stringa non è stata riconosciuta come DateTime valido in ParseExact con Milliseconds

Nov 23 2020

Ho una data in formato stringa, devo convertirla in DateTime, questo è il mio codice:

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());

Funziona con una data come: 2020-08-27T00: 00: 00 + 02: 00, ma non funziona con una data come quella nello script a causa dei millisecondi. Come devo modificare lo schema della data? Ne ho provati molti, ma non li ho risolti.

Risposte

4 John Nov 23 2020 at 13:53

Ci sono tre problemi con il tuo codice:

  1. Le stringhe di formato fanno distinzione tra maiuscole e minuscole (yyyy rappresenta un anno a 4 cifre, AAAA no, allo stesso modo dd rappresenta un giorno a 2 cifre, mentre DD no).
  2. .sssdovrebbe essere .fffper millisecondi.
  3. Ti aspetti Z (Zulu) ma in realtà ottieni un fuso orario ("+02: 00"). Ciò significa che la stringa di formato è diversa dalla stringa datetime.

Vi suggerisco di non perdere tempo con DateTime.ParseExactper ISO8601 datetimes, basta usare DateTimeOffset's Parseinvece (che obbedire alla differenza di orario e di lavoro con 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());