2

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) を無視しているようです。結果は冬には正しく、時間/ゾーンを物理的に変更しても正しいでしょう...しかし、現状では、これは英国でテストした「どの」マシンでも正しくありません。

4

2 に答える 2

0

ToLocalTime と ToUniversalTime は夏時間を考慮しており、非常にうまく機能しています。少なくとも .Net では、Javascript の Date オブジェクトに欠陥があるため、js での変換には moment.js と moment-timezone.js を使用することをお勧めします。

これが私の単体テストと結果です:

        var now = DateTime.Now;
        Console.WriteLine(now.ToLocalTime());
        Console.WriteLine(now.ToUniversalTime());

        //Test 1 TimeZone UTC+1 London, etc..
        //current day 20th July = BST

        /*  07/20/2015 01:06:43
            07/20/2015 00:06:43*/

        //set day to 20th Januray UK winter time

        /*  01/20/2015 01:07:55
            01/20/2015 01:07:55*/

上記の結果を .Net で取得するには、a) タイム ゾーンを UTC+2 に設定する必要があります。b) ToLocalTime() で不具合が発生しましたが、これは修正されています。MSDN では、日付を変換する際の XP の欠陥について言及しています。 .

最後に、DateTime.Now は現地時間を返すため、DateTime.Now.ToLocalTime() を使用するのは少し冗長であり、予期しない結果になる可能性があります。

于 2015-07-20T00:21:00.327 に答える