文字列がミリ秒のParseExactで有効な日時として認識されませんでした

Nov 23 2020

文字列形式の日付があります。DateTimeに変換する必要があります。これが私のコードです。

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

2020-08-27T00:00:00 + 02:00のような日付では機能しますが、ミリ秒のため、スクリプトのような日付では機能しません。日付パターンはどのように変更すればよいですか?私はそれらの多くを試しましたが、解決しませんでした。

回答

4 John Nov 23 2020 at 13:53

コードには3つの問題があります。

  1. 形式の文字列では大文字と小文字が区別されます(yyyyは4桁の年を表し、YYYYはそうではありません。同様に、ddは2桁の日を表しますが、DDはそうではありません)。
  2. .sss.fffミリ秒である必要があります。
  3. Z(Zulu)を期待していますが、実際には時間オフセット( "+02:00")が発生しています。これは、フォーマット文字列が日時文字列と異なることを意味します。

DateTime.ParseExactISO8601の日時については気にせず、代わりにDateTimeOffset'sParseを使用することをお勧めします(これは時間オフセットに従い、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());