クライアントのgetDate()
コードはそれが行く限り正しいように見えます。 テーブルに格納されている日付を処理するには、MySQL Connector /JJDBCドライバーも入手する必要があると思います。 誤ったタイムゾーン変換を回避するために、UTC日付として。これは、JDBC getTimestamp
に使用されるクライアントセッションのタイムゾーンとカレンダーに加えて、有効なサーバーのタイムゾーンを設定することを意味します。 あなたがしているように電話します。
失敗したアサーションで取得した値と、エラーの方向を確認してください。
expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>
戻ってきたのは10:30BST、つまり9:30GMTでした。これは、データベースがテーブル内の10:30をBST値として扱い、GMT日付として解析する前に、誤ってGMTに変換することと一致しています。これは、GMT値が誤ってBSTに変換されるのとは逆の方向です。
JDBCでは時間がローカルゾーンに変換される必要があるため、これはJDBC固有の問題である可能性があります。 (MySQL C APIがそうでない場合、おそらくCの従来の時間タイプはJavaのようにゾーンを認識しないためです。)そして、変換元のゾーンを知る必要があります 、 同じように。 MySQLのTIMESTAMP
タイプは常にUTCとして保存されます。しかし、それは DATETIME
には記載されていません タイプ。私は考える これは、MySQLが DATETIME
を解釈することを意味します サーバーのタイムゾーンにあるものとしての列の値。これはBSTに設定されているとおっしゃっていましたが、これはアサーションエラーメッセージに示されているシフトの方向と一致しています。
time_zone
設定したセッション変数は、MySQLサーバーにクライアントマシンのタイムゾーンを通知しますが、サーバーが自身のタイムゾーンをどのように認識しているかには影響しません。これは、<でオーバーライドできます。 code> serverTimezone JDBC接続プロパティ
。接続時に、 serverTimezone
を設定します UTCに変更し、 useLegacyDatetimeCode
を確認してください オフです。 (それが機能しない場合は、他のゾーン関連のプロパティを調べてください。)データベースと同じカレンダーフィールド値を使用して、日付がUTCとして取得されるかどうかを確認してください。
これにより、他の DATETIME
の解釈が変わることに注意してください。 データベース内の値:これらはすべて、(JDBC接続のコンテキストで)UTC日付のようになります。それが正しいかどうかは、最初にどのように入力されたかによって異なります。クライアントコードは希望どおりの動作をしますが、サーバーのタイムゾーンをサーバーレベルでUTCに設定しなくても、このシステム全体を完全に一貫して動作させることができるかどうかはわかりません。基本的に、ゾーンがUTCに設定されていない場合は、目的の動作に完全に構成されていないため、混乱していることになります。