问题描述
当我使用jdbcTemplate
插入new Date()
对象到Oracle数据库时,我可以看到jdbc驱动程序或Spring jdbcTemplate使用本地JVM偏移量插入了Date
.
When I insert new Date()
object using jdbcTemplate
to Oracle database, I can see that jdbc driver or Spring jdbcTemplate insert Date
using local JVM offset.
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.
For example when I insert Date object created in GMT this result to inserting 08-SEP-1987 in Oracle database if JVM timezone is USA.
推荐答案
java.util.Date
和Oracle Date
都不存储时区信息.在您的情况下,Jdbc驱动程序使用JVM时区转换日期.您可以使用以下选项之一:
Neither java.util.Date
nor Oracle Date
stores timezone information. In your case Jdbc driver converts your date using the JVM timezone. You can use one of the following options:
- 如果使用的是PreparedStatement,则可以使用
setDate(intparameterIndex, Date x, Calendar cal)
方法指定Calendar
在UTC时区. - 对于Spring
jdbcTemplate
,而不是插入Date
对象,请在UTC
时区插入Calendar
-
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
可以在JVM lvl上设置 - 在JVM启动时使用
-Duser.timezone=GMT
- If you are using PreparedStatement, you can use
setDate(intparameterIndex, Date x, Calendar cal)
method to specifyCalendar
in UTC timezone. - For Spring
jdbcTemplate
instead of insertingDate
object, insertCalendar
withUTC
timezone TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
could be set on JVM lvl- Use
-Duser.timezone=GMT
on JVM startup
这篇关于使用Java和Spring在Oracle数据库中插入UTC/GMT日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!