2016-02-05 93 views
0

我在另一个时区(美国,中央)使用的是我不控制的Oracle服务器。有一个包含DATE列的表格,当插入东西时,它会得到一个默认值SYSDATE(即,列始终设置为系统时间,而程序员不需要明确设置它)。使用JDBC从Oracle读取DATE字段

我在不同的时区(美国,东海岸)。如何使用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

你用什么dateformat模式来检查输出中的时间?请确保在该代码中设置时区(至utc) – Jan

+0

我将数字作为long(由getTime()返回,并将其复制到www.epochconverter.com。 –

回答

0

您可以传递JVM参数-Duser.timezone,如java -Duser.timezone=GMT,这应该有所斩获。但关于为整个JVM设置时区的一个重要事项是,它会影响所有内容。

如果您只需要在检索日期,时间或时间戳对象时设置时区。你可以不喜欢它

Calendar mycal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 

然后在结果集

Date correctDate = resultset.getDate("Timestampcolumn",mycal); 

我相信你也应该能够使用设定为TimeZone.setDefault()以及时区。

+0

这看起来像是getTimestamp()。getTime ()返回一个纪元UTC时间,这也是不正确的。 –