8

java.util.Date の getTime メソッドは、この Date オブジェクトが表す 1970 年 1 月 1 日 00:00:00 GMT からのミリ秒数を返すことがわかっています。

以下のような奇妙な状況に気づきました。

システムのタイムゾーン: (UTC+02:00)イスタンブール

Date currentDate = new Date();
System.out.println(currentDate .getTime());
System.out.println(currentDate);

Java コンソール出力:

1360753217219

水曜日 2 月 13 日 13:00:17 VET 2013


次に、私の JavaScript プラグインは、以下のような長いオブジェクトを使用しています。

Javascript:

console.log(new Date(1360753217219));

ブラウザ コンソール出力:

日付 {Wed Feb 13 2013 13:00:17 GMT+0200 (トルコ標準時)}


しかし、それでも大丈夫です!ローカルタイム ゾーン(UTC-04:30)カラカスに変更した後、状況と時間は同じミリ秒数で以下のように変化します。


Javascript:

console.log(new Date(1360753217219));

ブラウザ コンソール出力:

日付 {Wed Feb 13 2013 06:30:17 GMT-0430 (ベネズエラ標準時)}

誰かがこれを説明できますか?それはjsのバグですか?またはもっと重要なのは、js側の異なるタイムゾーンで同じミリ秒数で同じ日付を取得するには、Java側でこれをどのように処理すればよいですか?

ありがとう!

4

3 に答える 3

10

ミリ秒はタイムゾーンに依存しません。時間は、1970 年 1 月 1 日 GMT からの絶対値として測定されます。つまり、ミリ秒を取得してから、特定のタイム ゾーンの現地時間を後で計算するという考え方です。考えてみれば、それは理にかなっています。1970 年から経過したミリ秒の数は、どこにいても同じです。

少し混乱しますが、タイムゾーンを調整するためにミリ秒単位で処理しないでください。すべての Date ライブラリには、ミリ秒のスタンプをタイム ゾーン固有の現地時間に変換するメカニズムがあります。

したがって、特定の質問がサーバーとクライアントの間で効果的に日付を通信する方法である場合 (使用している言語は重要ではありません)、答えは、ミリ秒を前後にやり取りし、どちらの側でもグローバルな問題を解決することは完全に安全です。あなたが話している特定の時間、それがあなたがその時間で何をしているかの文脈にとって重要である場合.

于 2013-02-13T11:53:46.287 に答える
2

バグではありません。それがタイムゾーンのしくみです。

今、ベネズエラの誰かに電話して、今何時かと尋ねたら、彼はトルコより 6.5 時間早い (あなたの例によると) と言うでしょう。

あなたが言及したように、あなたが扱っている数値は、1970 年 00:00:00 GMTからのミリ秒数を表し、その同じ秒のカラカスでは、時刻は 31.12.1969 19:30 GMT-0430でした

したがって、何秒遅れても、ベネズエラの時間は GMT と比較して 4:30 時間早いままです。

同じ入力 (ミリ秒) を使用する場合、異なるタイム ゾーンでまったく同じ日付を取得することはできません。

同じ結果を得たい場合は、タイムゾーンの違い (この場合は 6.5 時間) を出力に追加できます。Dr.Dredel のアドバイスに従って、おそらくミリ秒をいじるべきではありません。

于 2013-02-13T11:50:36.853 に答える