Spring中的@DateTimeFormat会产生一天之内的错误

时间:2011-10-19 07:29:18

标签: spring datetime spring-mvc format

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

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

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

startDate=10%2F19%2F2011

不幸的是,一旦它在服务器上运行Spring,它将日期存储为10/18/2011 - 有一个一天的错误。

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

我应该注意@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

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

由于

2 个答案:

答案 0 :(得分:3)

我觉得很可能实际上属于时区问题。 Date对象及时代表即时 - 我怀疑如果你看一下你所获得的确切值(例如,在UTC中,为了保持清晰),你会得到一个更好的了解发生了什么。您可能会在“10/18/2011”看到它在不同的时区进行解释。

如果Spring支持转换为Joda Time类型,我建议使用它 - 那么您可以使用LocalDate真正 表示日期而非即时

答案 1 :(得分:1)

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

-Duser.timezone="Asia/Dhaka"