La chaîne n'a pas été reconnue comme un DateTime valide dans ParseExact avec des millisecondes

Nov 23 2020

J'ai une Date au format chaîne, j'ai besoin de la convertir en DateTime, voici mon code:

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

Cela fonctionne avec une date comme: 2020-08-27T00: 00: 00 + 02: 00, mais cela ne fonctionne pas avec une date comme celle du script à cause de millis. Comment changer le modèle de date? J'ai essayé beaucoup d'entre eux, mais je n'ai pas résolu.

Réponses

4 John Nov 23 2020 at 13:53

Il y a trois problèmes avec votre code:

  1. Les chaînes de format sont sensibles à la casse (aaaa représente une année à 4 chiffres, AAAA ne le fait pas, de même que jj représente un jour à 2 chiffres, contrairement à JJ).
  2. .sssdevrait .fffdurer des millisecondes.
  3. Vous attendez Z (Zulu) mais vous obtenez en fait un décalage horaire ("+02: 00"). Cela signifie que la chaîne de format diffère de votre chaîne datetime.

Je vous suggère de ne pas vous soucier DateTime.ParseExactdes datetimes ISO8601, utilisez simplement DateTimeOffsets à la Parseplace (qui obéira au décalage horaire et fonctionnera avec les datetimes ISO8601):

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