【问题标题】:java.sql.Timestamp has a timezone [duplicate]java.sql.Timestamp 有一个时区[重复]
【发布时间】:2019-08-07 14:09:08
【问题描述】:

我读过的所有内容都说时间戳是 UTC 并且没有偏移量或时区。但是,我 99% 肯定 MS Sql Server JDBC 正在从数据库中读取值并将其设置为我的本地时区。

更新:请不要参考可能重复的问题询问如何使用 UTC 日期时间设置时间戳。我的问题是如何读取数据库中的 UTC 时间戳值。

调试器显示作为时区为丹佛的 GregorianCalender 对象保存的对象。

【问题讨论】:

  • Date 的某个地方隐藏了一些时区信息,其中Timestamp 是一个子类,所以它也适用于那个类。它不会影响Timestamp 的任何可观察到的行为,所以我会说“有”一个时区对于所有实际目的都是不正确的。无论如何,该类设计不佳且已过时,因此您不应该使用它,因此不必关心它是否有时区。
  • Is java.util.Date using TimeZone? 的可能重复项(因为Timestampjava.util.Date 的子类)
  • 时间线处理是一团糟,它取决于数据库设置、会话时区和本地时区(当然还有数据类型)。它因驱动程序而异。使用getTimestamp(x, utccal) 变体来指定所需的时区确实有帮助
  • JDBC 规范要求在使用java.sql.Timestamp 时在当前时区解释时间戳,除此之外,java.sql.Timestamp.toString() 的实现将 打印当前时区的值。
  • @OleV.V.这是我们提供给客户的图书馆。因此,我们必须使用较旧的 JDBC 驱动程序运行,因为我们的一些客户仍在使用它们。

标签: java jdbc timestamp timezone java-time


【解决方案1】:

这似乎可以解决问题。我猜当它返回一个 LocalDateTime 时它不使用时区。

LocalDateTime localDT = timestamp.toLocalDateTime();
odt = localDT.atOffset(ZoneOffset.UTC);

根据@Ole V.V. 的建议进行了更新

【讨论】:

  • 由于 mssql-jdbc v7.1.0 驱动程序支持直接使用 rs.getObject(n, java.time.LocalDateTime.class) 而不是 rs.getTimestamp(n) 检索 LocalDateTime。 (我为此写了PR。)
  • 如果您出于遗留原因需要继续使用 getTimestamp,请注意遵守夏令时(也称为夏令时)的时区的“丢失时间”问题。例如,您无法在 America/Denver 中检索 2019-03-10T02:00:00,因为它从未在该特定时区发生过。
猜你喜欢
  • 2012-06-27
  • 2017-03-02
  • 2014-11-25
  • 1970-01-01
  • 2013-10-20
  • 2014-05-08
  • 2013-05-26
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多