web-dev-qa-db-ja.com

Javascript Date()が間違った日付を1時間遅らせる

私はコントローラからこの日付をJava(_Spring-MVC_)で送信しますmysqlの型はdatetimeです

_@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "..") public Date getYy() { 
    return this.yy; 
}
_

として:_[2015-09-30 00:00:00.0]_

_1443567600000_としてajaxでこの日付を取得すると:

new Date(1443567600000)変換:Tue Sep 29 2015 23:00:00 GMT+0000 (Maroc)

それで、なぜ私は1時間間違った日付を取得するのですか?

[〜#〜]ソリューション[〜#〜]

私たちはそれを解決します

_d = new Date(value) ;
d.setTime( d.getTime() - new Date().getTimezoneOffset()*60*1000 );
_

夏時間(DST)または夏時間の問題だったからです。良い 記事

10
Youssef

多分これは夏時間の問題だと思います。クライアントのタイムゾーンとサーバーのタイムゾーンを確認できます。 (WebサーバーまたはSQLサーバー)

4
Crazy Crab

DateのこのJS処理は、非常に重要です。

私は英国にいます...私たちはGMT(UTC)にいるので "簡単"です...夏時間(DST(British Summer Time、BST))があるときを除いて。時計は夏には進み、冬には戻ります(ちなみに愚かですが、それは別の問題です!)。 3月のある日の午後4時(GMT)は呼ばれる午後5時(BST)です.

月:

new Date( '2017-08-08' )を実行すると、(toString) 'Date 2017-08-08T00:00:00.000Z'が得られます。

ただし、new Date( '2017-08-08 00:00' )を実行すると、「日付2017-08 -7T2:00:00.000Z」になります!

2番目のケースでは、JSがBST時間を指定していた時間を規定したため、JSが「役立つ」ようにしようとしているように見えます。したがって、GMT/UTCに調整されます。そうでなければ、それはしません...(もちろん)それでもミリ秒まで特定のDateオブジェクトを生成します。かなり落とし穴!

確認:a winter月... BSTが適用されていない場合:new Date( '2018-01-01 00:00' )/new Date( '2018-01-01' ):どちらも 'Date 2018-01-01T00:00:00.000 Z '

調整に関しては、行った自動調整を元に戻すようです

jsDate.setTime( jsDate.getTime() + jsDate.getTimezoneOffset() * 60 * 1000 );

...これは、Youssefが書いたものと少し似ています...問題の特定のDateからオフセットを取得する必要があることを除いて...そして私の実験では、これを減算するのではなく、追加することを証明しているようです。

5
mike rodent

おそらくもっと多くのデータが必要になるはずですが、ここでは何も問題がない可能性があります。日付の設定方法と取得方法によって異なります。

基本的に 1443567600000にはタイムゾーンが含まれていません。 Tue Sep 29 2015 23:00:00グリニッジから。もちろん、タイムゾーンの異なる場所とは異なる瞬間です。同じ瞬間が別の時間に発生します(GMT + 1の真夜中はGMTの午後11時です)。

時間とタイムゾーンの両方をDBに保存する必要があり、場合によってはJSに送り返す必要があります。そうしないと、クライアントのローカル時間によって常に異なる解釈が行われます。

例を作るには:

var d = new Date(2015, 8, 30);
console.log(d.toJSON()); // In my case I got "2015-09-29T22:00:00.000Z"
console.log(d.toDateString()); // "Wed Sep 30 2015"
3
ZER0

もう少し詳しく言うと

 time = new Date("2018-06-01 " + time);
            var offset = time.getTimezoneOffset();
            offset = Math.abs(offset / 60);
            time.setHours(time.getHours() + offset);

この場合、時間は先行ゼロのある時間:先行ゼロのある分に等しい。これにより、時差がUTCに追加されます。文字列を日付に渡すと、UTCとして扱われます。

1
Daniel Santos