ISO8601 形式の日付/時刻文字列を .NET の DateTime 構造で解析しようとしています。
問題を完全に理解するために、.NET と JavaScript の両方を使用してテストを実行します。私は現在英国にいます (英国夏時間、UTC+01:00)。
ISO8601 についての私の理解は次のとおりです。
- 文字列の末尾に「Z」が付いている場合、時刻は UTC で表されます。
- 文字列に「+/-hh:mm」という接尾辞が付いている場合、時間は現地時間で表され、「+/-hh:mm」は UTC からのオフセットを表します。
次の ISO8601 日付/時刻形式の文字列を検討してください。
"1987-01-05T08:45:30.500+0100"
上記のポイントを考えると、この文字列は現地時間の「08:45:30」と UTC 時間の「07:45:30」を表しています。
現在のタイムゾーン テスト (.NET)
DateTime now = DateTime.Now;
Console.WriteLine(now.ToLocalTime()); // 27/08/2013 12:02:43
Console.WriteLine(now.ToUniversalTime()); // 27/08/2013 11:02:43
現在のタイムゾーン テスト (JavaScript)
var now = new Date(Date.now());
now.toString(); // Tue Aug 27 2013 12:03:46 GMT+0100 (GMT Daylight Time)
now.toUTCString(); // Tue, 27 Aug 2013 11:03:46 GMT
2 つの例の小さな違い (分/秒) を除けば、英国の夏時間 (UTC+01:00) に期待するとおりの結果が返されます。分/秒の違いは、.NET テストと JavaScript テストの両方を正確に同時に実行できないためです。
それでは、ISO8601 の日付/時刻形式の文字列を使用してみましょう。
ISO8601 フォーマット文字列の解析 (.NET)
DateTime dt = DateTime.Parse("1987-01-05T08:45:30.500+0100");
Console.WriteLine(dt.ToLocalTime()); // 05/01/1987 07:45:30
Console.WriteLine(dt.ToUniversalTime()); // 05/01/1987 07:45:30
ISO8601 フォーマット文字列の解析 (JavaScript)
var dt = new Date("1987-01-05T08:45:30.500+0100");
dt.toString(); // Mon Jan 05 1987 07:45:30 GMT+0000 (GMT Standard Time)
dt.toUTCString(); //Mon, 05 Jan 1987 07:45:30 GMT
これは、日付/時刻 " now "を表示する例と一致していないようです。「現在」の例が英国の夏時間 (UTC+01:00) で表示されているのに、英国の冬時間 (UTC+00:00) であるかのように表示されるのはなぜですか?
タイム ゾーンの設定を変更すると、ローカル/ユニバーサル タイムの期待どおりの結果が得られますが、現在のタイム/ゾーンに設定すると、一貫性のない結果が得られるようです。
編集:つまり、文字列を解析しようとすると、.NET と JavaScript の両方が夏時間/英国の夏時間 (UTC+01:00) を無視しているようです。結果は冬には正しく、時間/ゾーンを物理的に変更しても正しいでしょう...しかし、現状では、これは英国でテストした「どの」マシンでも正しくありません。