【问题标题】:java.sql.Timestamp#valueOf result depends on default timezone [duplicate]java.sql.Timestamp#valueOf 结果取决于默认时区 [重复]
【发布时间】:2017-03-02 16:15:30
【问题描述】:

我做了实验

for (String tz: TimeZone.getAvailableIDs()) {
    TimeZone.setDefault(TimeZone.getTimeZone(tz));
    timestamp = Timestamp.valueOf("1970-01-01 00:00:00.000");
    System.out.println(tz + " - " + timestamp.getTime());
}

出乎意料的是,每个时区的结果都不同。这背后的逻辑是什么?一直认为时间戳与时区无关。

【问题讨论】:

  • "1970-01-01 00:00:00.000" 必须在 some 时区的上下文中进行解释,因此它使用默认时区。你认为它只会使用 UTC 吗?
  • @GriffeyDog 是的,问题是日期字符串来自数据库,它被视为 UTC 日期
  • Strings 没有时区。要将String 转换为Timestamp,需要应用时区。 valueOf 使用默认时区进行从 StringTimestamp 的转换。
  • @GriffeyDog 嗯,奇怪的是 Timestamp 不支持在字符串中指定时区
  • 查看 dup 链接,还有this answer 以获得更详细的说明。

标签: java timezone timestamp


【解决方案1】:

因为 Timestamp 使用 UTC TimeZone,如果更改 Timezone 会有所不同,即在伦敦是 1970-01-01 00:00:00.000 (GMT+1) 在西班牙加那利群岛是 1969-12-31 23: 00:00.000(格林威治标准时间)

*编辑:在大多数情况下,UTC 被认为可以与 GMT 互换

【讨论】:

  • 实际上,在 1970-01-01,伦敦在 GMT+1,加那利群岛在 GMT。您的时间是正确的,但您的偏移量都相差一个小时。
  • @MattJohnson 感谢您的肯定!
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多