4

new Date()Oracle データベースを使用してオブジェクトを挿入するjdbcTemplateと、jdbc ドライバーまたは Spring jdbcTemplate がDateローカル JVM オフセットを使用して挿入されることがわかります。

SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date timeZoneDate = sdf.parse("09-SEP-1987");

たとえば、GMT で作成された Date オブジェクトを挿入すると、JVM タイムゾーンが USA の場合、Oracle データベースに 08-SEP-1987 が挿入されます。

4

2 に答える 2

20

java.util.DateOracle もDateタイムゾーン情報も保存しません。あなたの場合、Jdbc ドライバーは JVM タイムゾーンを使用して日付を変換します。次のいずれかのオプションを使用できます。

  • PreparedStatement を使用している場合は、メソッドを使用 して UTC タイムゾーンでsetDate(int parameterIndex, Date x, Calendar cal)指定できます。Calendar
  • オブジェクトを挿入jdbcTemplateする代わりにSpringの場合、タイムゾーンで挿入しますDateCalendarUTC
  • TimeZone.setDefault(TimeZone.getTimeZone("GMT"))JVM レベルで設定できます
  • -Duser.timezone=GMTJVMの起動時に使用
于 2012-09-26T06:37:10.733 に答える
4

OracleDATEデータ型にはタイムゾーン フィールドがありません。日付と時刻のコンポーネントのみが格納されます。したがって、jdbcがタイムゾーン付きの日付をデータベース フィールドに挿入する場合DATE、消えるタイムゾーン情報をどうするかを決定する必要があります。

あなたの場合、挿入する前にjdbcJavaをロケールのタイムゾーンに変換しているようです。Date挿入時に日付09-SEP-1987 00:00:00 UTCが変換され08-SEP-1987 20:00:00 EST、タイムゾーン情報が削除されます。

そのため、フィールドに挿入するときにタイムゾーンを指定しDATEて、デフォルトのロケールのタイムゾーンが使用されるようにするか、デフォルトのタイムゾーンと JavaDateタイムゾーンの両方を変更することができます。

于 2012-09-24T11:29:44.253 に答える