【问题标题】:Date values retrieved from database are showing previous day value using java.util.date [duplicate]从数据库中检索的日期值使用 java.util.date 显示前一天的值 [重复]
【发布时间】:2020-05-08 17:19:28
【问题描述】:

我的代码中出现了这种奇怪的现象。我正在使用 spring data jpa 和 MySQL 数据库。我有一个名为“提交”的表,其中包含名为“finishedAt”的日期字段。该字段的数据类型是:“日期”。

我在 Java 中有一个映射类:

@Entity
@Table(name = "Submission")
@Getter
@Setter
public class Submission{
     //All the fields here

     @Temporal(javax.persistence.TemporalType.DATE)
     java.util.Date finishedAtValue 
}

有一种方法会尝试访问此日期值。当我打印日期时,我会看到前一天的值。

例子:

假设数据库中的日期值为 2020-06-05 (yyyy-mm-dd)

方法中的sn-p代码如下:

//Code to get the entity from database successfully - submission

log.info("DateTimeAnswer retrieved from database: "+submission.getFinishedAtValue);
/*Expected date value from above log: 2020-06-05
Actual date value from above log: 2020-06-04*/

在提取此日期值时无法理解为什么会出现这种不一致。任何帮助,将不胜感激。谢谢!



【问题讨论】:

  • 最可能的原因是应用程序中的时区与数据库使用的会话时区不匹配。 MySQL 也有许多日期错误。数据库、客户端和会话中的时区是什么?在您的应用程序中,使用 JPA 数据库连接记录 TimeZone.getDefault() 的结果和 SELECT @@global.time_zone, @@session.time_zone 的结果。
  • 另请参阅最新 MySQL Connector/J 驱动程序的发行说明,该驱动程序修复了 Date 处理中的错误:dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-20.html
  • 数据库时区和应用时区不同。 SELECT @@global.time_zone 返回 +03.00 和 TimeZone.getDefault() 返回 sun.util.calendar.ZoneInfo[id="America/Denver"]
  • 但是@@session.time_zone呢?
  • 返回+03.00。

标签: java date java.util.date


【解决方案1】:

java.util.Date 类 getter 方法返回当天的索引。这是Date 类行为。

问题似乎或多或少与TimeZone 的差异有关。

请尝试以下类似问题的答案。

类似问题:SimilarQuestion

【讨论】:

  • 感谢您的回复。如果我在数据库中的日期为:2020-06-01,它将日期值记录为 2020-05-31。
  • 我已经添加了类似问题的链接,这将帮助您更好地理解它。这似乎或多或少与时区差异有关。
  • 感谢您的参考!
【解决方案2】:

在存储日期之前和检索日期之后检查日期的时间部分。我猜这是由于a bug in the MySQL driver prior to 8.0.20. 如果日期 2020-06-05 被视为午夜 +03:00,然后转换为 -06:00,那么它将是 6 月 4 日下午 6 点,山区夏令时。

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多