我在另一个时区(美国,中部)使用我无法控制的Oracle服务器。有一个带有DATE列的表,当插入内容时,它会获得一个默认值SYSDATE(即,该列总是设置系统的时间,而程序员不需要明确地设置它。)
我在不同的时区(美国,东海岸)。如何使用JDBC读取此列并获取Epoch / UTC时间?
当我调用getTimestamp().getTime()
(在ResultSet上)时,我将时间转换为本地时间。也就是说,如果在上午10点在服务器上插入了某些内容,那么这里是上午11点(UTC时间下午4点)。当我拨打getTimestamp().getTime()
时,我会在当地时间上午10点(UTC时间下午3点)获得一个纪元。
我有部分答案。
Calendar sqlServerCalendar = Calendar.getInstance(TimeZone.getTimeZone("CST"));
long t = rs.getTimestamp("timestampcolumn", sqlServerCalendar).getTime();
这不太理想,因为我必须指定服务器的时区(我将进入设置)。但它确实似乎回归了我想要的答案。有没有办法在运行时查询服务器的时区,而不是需要设置?或者,有更好的方法吗?我宁愿一个解决方案,不必知道(通过硬编码值或设置)它或服务器所在的时区(如果在不同的时区运行,和/或如果服务器移动,它将不会被修改)
答案 0 :(得分:0)
您可以传递JVM参数-Duser.timezone
,例如java -Duser.timezone=GMT
,这应该可以解决问题。但是,为整个JVM设置时区时要记住的一件重要事情是它会影响所有内容。
如果您只需要在检索日期,时间或时间戳对象时仅为时区设置。你可以像
那样做Calendar mycal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
然后在结果集上
Date correctDate = resultset.getDate("Timestampcolumn",mycal);
我相信你也应该能够使用TimeZone.setDefault()
来设置时区。