Java Date をSQLに書き込む前に [〜#〜] timestamp [〜#〜] 列、 [ 〜#〜] jdbc [〜#〜] 日付をJava仮想マシンのタイムゾーンからデータベースセッションのタイムゾーンに変換しますか?
たとえば、Java仮想マシンのタイムゾーンは [〜#〜] utc [〜#〜] であり、データベースセッションのタイムゾーンは TC)であるとします。 -5 。JVMによると、Javaプログラムが_2000-01-01 00:00:00
_を PreparedStatement#setTimestamp(int, Timestamp)
に渡して保存しようとした場合標準では、データベースは_TIMESTAMP '2000-01-01 00:00:00'
_または_TIMESTAMP '1999-12-31 19:00:00'
_を格納しますか?
いいえ、 [〜#〜] jdbc [〜#〜] は、クライアントがデータベースにアクセスする方法に関するAPIにすぎません。タイムスタンプストレージの場合、これは、JDBCAPI標準に準拠するデータベースドライバーを作成する組織に依存する必要があります。
ここに MySQLのPreparedStatement
の実装の実装。彼らはJavaのJVMタイムゾーンをMySQLタイムゾーンに持っていくようです(setTimestampInternal()
メソッドをチェックしてください)。
ここでの私の要件は、JVMのタイムゾーンに関係なく、値をGMT/UTCに格納する必要があることです。タイムゾーンをその場で設定し、JDBCを使い終わったら設定を解除する方法はありますか?
編集:わかりました、私はその問題を回避する方法を見つけました。次のことをしました
TimeZone default = TimeZone.getDefault();
try
{
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
//Do stuff with JDBC
}
finally
{
TimeZone.setDefault(default);
}
オーバーロードされたsetTimestamp
セッターを使用してCalendar
インスタンスを受け入れ、タイムゾーンを指定できます
サンプル(Joda日時を使用している場合):
org.joda.time.DateTime sendDateUTC = new DateTime( DateTimeZone.UTC ).withMillis( millis );
statement.setTimestamp (1, sendDateUTC, sendDateUTC.toGregorianCalendar() );
JavaDocによると:指定されたCalendar
オブジェクトを使用して、指定されたパラメータを指定されたJava.sql.Timestamp
値に設定します。ドライバーはCalendar
オブジェクトを使用してSQL TIMESTAMP
値を作成し、それをデータベースに送信します。 Calendar
オブジェクトを使用すると、ドライバーはカスタムタイムゾーンを考慮してタイムスタンプを計算できます。 Calendarオブジェクトが指定されていない場合、ドライバーはデフォルトのタイムゾーンを使用します。これは、アプリケーションを実行している仮想マシンのタイムゾーンです。
void setTimestamp(int parameterIndex, Java.sql.Timestamp x, Calendar cal)
throws SQLException;