【问题标题】:Reading DATE field from Oracle with JDBC使用 JDBC 从 Oracle 读取 DATE 字段
【发布时间】:2016-02-05 03:29:56
【问题描述】:

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

这并不理想,因为我必须指定服务器的时区(我将进入设置)。但它似乎确实返回了我想要的答案。有没有办法可以在运行时查询服务器的时区,而不需要设置?或者,有没有更好的方法来做到这一点?我希望解决方案不必知道(通过硬编码值或设置)它或服务器位于哪个时区(因此如果在不同时区运行和/或服务器移动,它将不加修改地工作) .

【问题讨论】:

  • 您使用什么日期格式模式检查输出中的时间?确保在该代码中设置时区(到 UTC)
  • 我得到的数字很长(由 getTime() 返回,并将其复制到 www.epochconverter.com。

标签: java sql oracle jdbc


【解决方案1】:

您可以传递 JVM 参数 -Duser.timezone,例如 java -Duser.timezone=GMT,这应该可以解决问题。但是,在为整个 JVM 设置时区时要记住的重要一点是,它会影响一切。

如果您只需要在检索日期、时间或时间戳对象时设置时区。你可以这样做

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

然后在结果集上

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

我相信您也应该能够使用TimeZone.setDefault() 设置时区。

【讨论】:

  • 这看起来让 getTimestamp().getTime() 返回 UTC 上午 10 点的纪元,这也不正确。
猜你喜欢
  • 2017-12-19
  • 2017-06-14
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
  • 2017-06-17
  • 2018-07-01
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多