![](/img/trans.png)
[英]In the Oracle JDBC driver, what happens to the time zone when you write a Java date to a TIMESTAMP column?
[英]Before writing a Java Date to an SQL TIMESTAMP column, does JDBC translate the date from the JVM time zone to the database session time zone?
现在我的要求是它应该以GMT / UTC存储值,而不管JVM的时区。 有没有办法在运行时设置时区,然后在完成JDBC后取消设置时区?
编辑:好的,我找到了解决这个问题的方法。 做了以下
TimeZone default = TimeZone.getDefault();
try
{
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
//Do stuff with JDBC
}
finally
{
TimeZone.setDefault(default);
}
您可以使用重载的setTimestamp
setter接受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;
规范很傻。 java.util.Date存储GMT参考帧中纪元的毫秒数。 Java.sql.Timestamp是同一参考帧中的Date加纳秒。 所有未弃用的getter和setter都使用GMT参考框架。 对于任何类型的健全性,存储时间戳的默认时区应为GMT。
在多层应用程序中,前端,驱动程序和数据库服务器都可以位于不同的时区。 有些层可能同时位于不同的时区; 例如,如果您在整个大陆进行互联网负载平衡,或者您有一个移动应用程序连接到中央服务器。 云操作环境与您不知道JDBC驱动程序将在何处运行的情况大致相同,也不会保证永远不会发生变化。
我知道在这些环境中实现一致性的唯一方法是仅使用接受日历的参数setter和ResultSet getter,并确保访问数据的每个应用程序都使用某些日历,最好是GMT或UTC。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.