使用JDBC从Oracle读取DATE字段

时间:2016-02-05 03:29:56

标签: java sql oracle jdbc

我在另一个时区(美国,中部)使用我无法控制的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();

这不太理想,因为我必须指定服务器的时区(我将进入设置)。但它确实似乎回归了我想要的答案。有没有办法在运行时查询服务器的时区,而不是需要设置?或者,有更好的方法吗?我宁愿一个解决方案,不必知道(通过硬编码值或设置)它或服务器所在的时区(如果在不同的时区运行,和/或如果服务器移动,它将不会被修改)

1 个答案:

答案 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()来设置时区。