setTimestamp(int parameterIndex, Timestamp x)
には明示的に指定されていませんが ドライバーは、setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
によって確立されたルールに従う必要があります javadoc:
指定されたパラメータを指定された
java.sql.Timestamp
に設定します 指定されたCalendar
を使用した値 物体。ドライバーはCalendar
を使用します SQLTIMESTAMP
を構築するオブジェクト 値。ドライバーはこれをデータベースに送信します。Calendar
オブジェクトの場合、ドライバーはカスタムタイムゾーンを考慮してタイムスタンプを計算できます。Calendar
がない場合 オブジェクトが指定されている場合、ドライバーはデフォルトのタイムゾーンを使用します。これは、アプリケーションを実行している仮想マシンのタイムゾーンです。
setTimestamp(int parameterIndex, Timestamp x)
で呼び出す場合 JDBCドライバーは、仮想マシンのタイムゾーンを使用して、そのタイムゾーンのタイムスタンプの日付と時刻を計算します。この日時はデータベースに保存されるものであり、データベース列にタイムゾーン情報が保存されていない場合、ゾーンに関する情報はすべて失われます(つまり、データベースを使用するアプリケーションは、同じタイムゾーンを一貫して作成するか、タイムゾーンを識別するための別のスキームを考え出します(つまり、別の列に保存します)。
例:ローカルタイムゾーンはGMT+2です。 「2012-12-2510:00:00UTC」を保存します。データベースに保存されている実際の値は「2012-12-2512:00:00」です。再度取得します。「2012-12-2510:00:00 UTC」として再度取得します(ただし、getTimestamp(..)
を使用して取得した場合のみ )、ただし、別のアプリケーションがタイムゾーンGMT + 0でデータベースにアクセスすると、タイムスタンプは「2012-12-2512:00:00UTC」として取得されます。
別のタイムゾーンに保存する場合は、setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
を使用する必要があります。 必要なタイムゾーンのCalendarインスタンスを使用します。値を取得するときは、同じタイムゾーンで同等のゲッターも使用するようにしてください(TIMESTAMP
を使用する場合) データベースにタイムゾーン情報がありません)。
したがって、実際のGMTタイムゾーンを保存する場合は、次を使用する必要があります。
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
JDBC 4.2では、準拠ドライバーはjava.time.LocalDateTime
をサポートする必要があります (およびjava.time.LocalTime
)TIMESTAMP
の場合 (およびTIME
)get/set/updateObject
を介して 。 java.time.Local*
クラスにはタイムゾーンがないため、変換を適用する必要はありません(ただし、コードが特定のタイムゾーンを想定している場合は、新しい一連の問題が発生する可能性があります)。