Zeichenfolge wurde in ParseExact mit Millisekunden nicht als gültige DateTime erkannt

Nov 23 2020

Ich habe ein Datum im Zeichenfolgenformat. Ich muss es in DateTime konvertieren. Dies ist mein 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());

Es funktioniert mit einem Datum wie: 2020-08-27T00: 00: 00 + 02: 00, aber es funktioniert aufgrund von Millis nicht mit einem Datum wie dem im Skript. Wie soll ich das Datumsmuster ändern? Ich habe viele davon ausprobiert, aber nicht gelöst.

Antworten

4 John Nov 23 2020 at 13:53

Es gibt drei Probleme mit Ihrem Code:

  1. Bei Formatzeichenfolgen wird zwischen Groß- und Kleinschreibung unterschieden (JJJJ steht für ein vierstelliges Jahr, JJJJ nicht, TT steht ebenfalls für einen zweistelligen Tag, TT nicht).
  2. .ssssollte .ffffür Millisekunden sein.
  3. Sie erwarten Z (Zulu), aber Sie erhalten tatsächlich einen Zeitversatz ("+02: 00"). Dies bedeutet, dass sich die Formatzeichenfolge von Ihrer Datums- / Uhrzeitzeichenfolge unterscheidet.

Ich schlage vor, Sie DateTime.ParseExactkümmern sich nicht um ISO8601-Datenzeiten, sondern verwenden stattdessen nur DateTimeOffset's Parse(wodurch der Zeitversatz eingehalten wird und mit ISO8601-Datenzeiten gearbeitet wird):

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