2012-09-24 39 views
4

當我使用jdbcTemplate插入new Date()對象到Oracle數據庫時,我可以看到jdbc驅動程序或Spring jdbcTemplate使用本地JVM偏移量插入Date使用Java和Spring在Oracle數據庫中插入UTC/GMT日期

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

例如,當我插入GMT創建此結果在Oracle數據庫中插入08-SEP-1987如果JVM時區是美國Date對象。

+0

在數據庫中的相關列如何申報? –

+0

在數據庫中,我有DATE類型 – user12384512

回答

18

java.util.Date和Oracle Date都不存儲時區信息。在你的情況下,Jdbc驅動程序使用JVM時區轉換你的日期。您可以使用下列選項之一:

  • 如果使用PreparedStatement的,你可以使用setDate(int parameterIndex, Date x, Calendar cal)方法來指定UTC時區Calendar
  • 春天jdbcTemplate而不是插入Date對象,插入CalendarUTC時區
  • TimeZone.setDefault(TimeZone.getTimeZone("GMT"))可以在JVM設置拉特
  • 使用-Duser.timezone=GMT在JVM啓動
+1

不知道如何插入日曆對象。太好了! –

+1

+1,具有日曆對象的springjdbc模板對我很好 –

3

Oracle DATE數據類型沒有時區字段。它僅存儲日期和時間組件。因此,當jdbc將具有時區的日期插入到DATE數據庫字段中時,它必須決定如何處理將消失的時區信息。

就你而言,看起來jdbc在插入之前將java Date轉換爲語言環境時區。日期09-SEP-1987 00:00:00 UTC轉換爲08-SEP-1987 20:00:00 EST,插入時刪除時區信息。

瞭解到,您可以在插入DATE字段時指定時區,以便使用默認語言環境時區或修改默認時區和java時區。

+2

轉換爲本地時區是JDBC API doc中的一項要求:_「使用正在運行的虛擬機的默認時區將指定參數設置爲給定的java.sql.Date值「_ [PreparedStatement.setDate()](http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#setDate(int,%20java.sql.Date, %20java.util.Calendar)) –

+0

當您的Oracle列數據類型是時間戳時,此轉換是否也發生? – supertonsky

+0

@supertonsky Oracle ['TIMESTAMP'](http://docs.oracle.com/database/121/SUTIL/GUID-E2DB6A6E-FBCA-49B1-B8F0-D13A5B8BCB14.htm)數據類型沒有時區組件,所以行爲應該是一樣的。如果您想要使用['TIMESTAMP WITH TIME ZONE'](http://docs.oracle.com/database/121/SUTIL/GUID-DBCD234A-8355-4130-A5B3-B8231F0088AF.htm#SUTIL1171)數據類型,您可以使用[存儲時區數據。 –

相關問題