【问题标题】:Getting the date goes back one day让日期回到一天
【发布时间】:2017-12-07 15:20:54
【问题描述】:

我有一个带有字段的实体

public class MovieReleaseDateEntity {
     @Basic
     @Column(name = "release_date")
     @Temporal(TemporalType.DATE)
     private Date date;
}

我将日期保存在数据库中

https://zapodaj.net/14dfcfb70926a.png.html

我是从数据库下载后得到的

"date": "2017-12-06T23:00:00.000+0000"

日期提前一天。为什么?

【问题讨论】:

  • 在以 dB 为单位存储之前,您在哪个时区获取日期。
  • 我在波兰。
  • 您的计算机中定义了哪个时区?
  • 真的是相差几小时吗?如果相差几个小时,则可能是时区问题。

标签: java spring hibernate date spring-mvc


【解决方案1】:

tl;博士

这些都代表时间轴上的同一点,同一时刻:

  • 2017-12-06T23:00:00.000+0000
  • 2017-12-07T00:00:00.000+01:00
  • 2017-12-07T04:30:00.000+05:30

详情

Europe/Warsaw time zone 目前比UTC 早一小时。

“2017-12-06T23:00:00.000+0000”

您的字符串代表 UTC 中的一个时刻。请注意+0000+00:00 的缩写,表示距 UTC 零小时零分钟的偏移量。所以它在UTC。

通过波兰墙上的时钟镜头看到的同一时刻是下一个日期早上的 00:00。这是波兰新一天的第一刻。

“2017-12-07T00:00:00.000+01:00”

同一时刻后来出现在印度的挂钟上,那里的人们比世界标准时间早了五个半小时。

“2017-12-07T04:30:00.000+05:30”

如果波兰的失眠症患者打电话给他们在北美西海岸的朋友,他们可能会在早些时候的下午 3 点发现他们的朋友还在工作。墙上的时钟比世界标准时间晚八小时。

“2017-12-06T15:00:00.000-08:00”

将您的输入字符串解析为OffsetDateTime 对象。要查看其他时区的同一时刻,请添加ZoneId 以获取ZonedDateTime。搜索 Stack Overflow 以获取详细信息,因为这已被多次介绍。

避免麻烦的有缺陷的旧日期时间类,例如Date。仅使用它们的替代品,即现代行业领先的 java.time 类。

【讨论】:

    【解决方案2】:

    它不会将日期还原,它会在不同的时区检索日期,减少一小时并显示为前一天(因此2017-12-07 00:00:00 变为2017-12-06 23:00:00)。您可能正在使用的 java.datejava.sql 软件包只是以毫秒为单位的包装器,表示为 Longs,因此还需要时区。

    检查您的时区并检查服务器的时区并确保它们匹配。如果由于任何原因无法更改,则可以在从数据库中检索时使用日期格式化程序来解析特定时区的时间

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 2021-04-15
      • 2017-11-26
      • 2023-03-06
      • 2018-06-17
      • 1970-01-01
      • 2012-01-21
      • 2014-04-16
      相关资源
      最近更新 更多