web-dev-qa-db-ja.com

Java日付をSQLTIMESTAMP列に書き込む前に、JDBCは日付をJVMタイムゾーンからデータベースセッションタイムゾーンに変換しますか?

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'_を格納しますか?

26
Derek Mahar

いいえ、 [〜#〜] jdbc [〜#〜] は、クライアントがデータベースにアクセスする方法に関するAPIにすぎません。タイムスタンプストレージの場合、これは、JDBCAPI標準に準拠するデータベースドライバーを作成する組織に依存する必要があります。

ここに MySQLのPreparedStatementの実装の実装。彼らはJavaのJVMタイムゾーンをMySQLタイムゾーンに持っていくようです(setTimestampInternal()メソッドをチェックしてください)。

13
Buhake Sindi

ここでの私の要件は、JVMのタイムゾーンに関係なく、値をGMT/UTCに格納する必要があることです。タイムゾーンをその場で設定し、JDBCを使い終わったら設定を解除する方法はありますか?

編集:わかりました、私はその問題を回避する方法を見つけました。次のことをしました

TimeZone default = TimeZone.getDefault();
try
{
  TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

  //Do stuff with JDBC
}
finally
{
  TimeZone.setDefault(default);
}
7
Jagat

オーバーロードされた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;
2
Diana Yashaev