1

GMT0 (または UTC) から計算されたミリ秒単位の時刻から Javascript 日付オブジェクトを作成しようとしています。

2013年の時点で次のコードを使用します(ここで検証可能):

var t = new Date(Date.UTC(0, 0, 0, 0, 0, 0, 0));
t.setMilliseconds(1383447600000);

しかし、次のように呼び出すと:

alert(t.getFullYear());
alert(t.getUTCFullYear());

2013年ではなく1943年です!

なんで?そして、これを解決する方法は?ありがとう!

JsFiddle は次のとおりです。http://jsfiddle.net/EVf72/

4

3 に答える 3

4

短い答え:setTimeの代わりに使用しsetMillisecondsます。

長い答え:

問題は、開始日が正しくないことです。の値はエポック(1970 年 1 月 1 日 00:00:00 UTC)1383447600000からの秒数ですが、開始日はエポック 0ではありません! 代わりに、それは年です:01899

> var t = new Date(Date.UTC(0, 0, 0, 0, 0, 0, 0));
> console.log(t.getFullYear());
1899

次にsetMillisecondsrange over を使用して999指定すると、値が適切な年数、日数、時間数、秒数、ミリ秒数に変換され、現在の日付に加算されます。

138344760000043年強に相当します。つまり、基本的には、1899 年に 43 年強を追加するように JavaScript に指示しているので、1943 年になります。

のドキュメントからsetMilliseconds

想定範囲外の数値を指定すると、それに応じて Date オブジェクトの日付情報が更新されます。たとえば、1005 を指定すると、秒数は 1 ずつ増加し、ミリ秒には 5 が使用されます。

Date.UTC代わりにepoch に一致するように正しい開始点を指定し0た場合は、正しい答えが得られます。

> var t = new Date(Date.UTC(1970, 0, 0, 0, 0, 0, 0)); //First param is year
> t.setMilliseconds(1383447600000);
> console.log(t.getFullYear());

2013

ただし、そのすべてを行う代わりに、次のように単純に使用できますsetTime

> var t = new Date();
> t.setTime(1383447600000);
> console.log(t.getFullYear());

2013

要約すると、以下は機能的に同等です。

> var t = new Date(Date.UTC(1970, 0, 0, 0, 0, 0, 0)); //First param is year
> t.setMilliseconds(1383447600000);
> console.log(t.getFullYear());

2013

> var t = new Date();
> t.setTime(1383447600000);
> console.log(t.getFullYear());

2013

しかし、 epoch からのミリ秒を扱っている場合は0、 を使用するか、または を使用するsetTime場合は実際に epoch 0(を使用Date.UTC)で開始する必要がありますsetMilliseconds

于 2013-08-02T18:00:33.480 に答える
1

Date.UTC(0, 0, 0, 0, 0, 0, 0)が大きな負の数であるために発生しています。それはあなたを過去に連れて行きます。セマンティクスを呼び出すとsetMilliseconds()、その過去の時間のミリ秒値を更新しているということです。それはその時間を巻き戻しますが、あなたはずっと前に始めたので、それはまだ70年も前のことです.

Date インスタンスの.setTime()API は、日付全体を提供されたタイムスタンプ値に強制的に設定し、以前の値を完全に上書きします。

于 2013-08-02T18:03:22.597 に答える