私はコントローラからこの日付を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)または夏時間の問題だったからです。良い 記事
多分これは夏時間の問題だと思います。クライアントのタイムゾーンとサーバーのタイムゾーンを確認できます。 (WebサーバーまたはSQLサーバー)
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
からオフセットを取得する必要があることを除いて...そして私の実験では、これを減算するのではなく、追加することを証明しているようです。
おそらくもっと多くのデータが必要になるはずですが、ここでは何も問題がない可能性があります。日付の設定方法と取得方法によって異なります。
基本的に 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"
もう少し詳しく言うと
time = new Date("2018-06-01 " + time);
var offset = time.getTimezoneOffset();
offset = Math.abs(offset / 60);
time.setHours(time.getHours() + offset);
この場合、時間は先行ゼロのある時間:先行ゼロのある分に等しい。これにより、時差がUTCに追加されます。文字列を日付に渡すと、UTCとして扱われます。