【问题标题】:@DateTimeFormat in Spring produces off-by-one day errorSpring 中的 @DateTimeFormat 会产生错误的一天错误
【发布时间】:2011-12-10 16:48:08
【问题描述】:

我目前在域对象中使用@DateTimeFormat,如下所示:

@DateTimeFormat(pattern = "MM/dd/yyyy")
private Date startDate = new Date();

在 Spring MVC 控制器中,我使用 jQuery UI 日期选择器发布今天的日期:2011 年 10 月 19 日,并且我确认这是使用 firebug 作为 HTTP Post 参数发送的,如下所示:

startDate=10%2F19%2F2011

不幸的是,一旦它到达服务器上的 Spring,它将日期存储为 2011 年 10 月 18 日 - 有一个偏离一天的错误。

我的代码中没有任何内容可以远程触及日期 - 没有任何计算或与此日期有关的任何事情。

关于@DateTimeFormat 有什么我应该注意的吗?

Hibernate 中的某些东西也会负责更改日期吗?

我也在查看我的数据库中的这个应用程序。我正在存储另一个日期,称为creationDate,它是一个实际时间戳,与用户输入不同。在大多数情况下,日期是相同的,但客户希望能够设置不同的日期,这就是 startDate 的用途。

Start Date              Creation Date (actual timestamp, not user input)
2011-04-17 19:00:00     2011-04-17 21:32:27
2011-04-18 19:00:00     2011-04-18 21:14:01
2011-04-20 19:00:00     2011-04-20 23:06:47
2011-04-26 19:00:00     2011-04-26 23:24:34
2011-04-28 19:00:00     2011-04-28 20:07:06
2011-05-01 19:00:00     2011-05-02 13:35:37
2011-06-21 19:00:00     2011-06-22 15:06:36
2011-07-28 19:00:00     2011-07-29 15:32:35
2011-09-03 19:00:00     2011-09-04 13:11:45
2011-10-11 19:00:00     2011-10-12 11:45:14
2011-10-11 19:00:00     2011-10-12 11:49:55
2011-10-18 19:00:00     2011-10-19 02:20:43

起初它似乎是从 5 月开始的一个错误,但后来我意识到如果超过 19:00:00 日期是正确的,如果它低于 19:00:00 则错误.

我讨厌 Java :(

当 Spring 创建给定 10/19/2011 的日期时,似乎会出现问题 - 它似乎将用户输入转换为 2011-10-18 19:00:00

什么是最简单的解决方案?

谢谢

【问题讨论】:

    标签: spring datetime spring-mvc format


    【解决方案1】:

    在我看来,这实际上很可能是时区问题。 Date 对象代表一个 instant 及时 - 我怀疑如果您查看您所拥有的确切值(例如,在 UTC 中,以保持清晰),您会更好地了解这是怎么回事。您看到“2011 年 10 月 18 日”的地方可能是您在不同的时区解释它。

    如果 Spring 支持转换为 Joda Time 类型,我建议改用它 - 然后您可以使用 LocalDate,它确实确实意味着日期而不是瞬间。

    【讨论】:

    • 是的,你可能是对的。我不使用 JodaTime,因为它经常与 Hibernate 产生各种依赖问题。我不需要做任何花哨的计算,所以我一直避免让我的依赖关系更简单。如何在不使用 joda 时间的情况下解决此问题?只需将时间设置为始终超过 19:00:00?
    • @egervari:如果不知道问题出在哪里,很难提出修复建议。您已编辑帖子以显示“开始日期”,但没有显示您是如何获得的。例如,可能通过在任何地方使用 UTC,您可以解决所有问题。
    • 开始日期不是一个计算。它是用户输入。系统将当前日期设置为默认日期,即最终存储的日期。应用程序这部分的一切都是微不足道的——控制器、服务层和 dao。我使用标准的 Hibernate 来存储它,我什至没有设置类型 - 所以它基本上也是 hibernate 的默认日期类型。一切都是默认的——这就是我要说的。这是超级微不足道的。我希望我不必将所有内容都转换为 Joda Time。虽然我承认这样更好,但我不想投入那样的时间。
    • 另外,我编辑的修复在服务器上不起作用......所以我宁愿不使用它。我可以做的最简单的修复是什么让 Spring 创建一个不会产生这个错误的日期?明显的问题是在 Spring 内部——而不是我的代码。 @DateTimeFormat 似乎是罪魁祸首。
    • @egervari:我认为问题出在哪里还不是很明显。你一直忙于到处推卸责任,但没有真正调试到发生了什么,我们真的不能说哪里出了问题。 也许 Spring 没有在它用来解析的SimpleDateFormat 上设置正确的时区。 也许 Linux JDK 中存在错误,尽管这似乎不太可能。即使问题可能与您的应用程序代码无关,但由于没有显示用于诊断问题的代码,您已经造成了严重的混乱。 (续)
    【解决方案2】:

    我发现使用参数中指定的本地时区启动 JVM 可以解决此问题。对我来说,它只是将这一行添加到运行配置中:

    -Duser.timezone="Asia/Dhaka"
    

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2016-01-17
      • 2021-12-03
      • 2023-03-03
      • 2021-12-08
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多