我目前在域对象中使用@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
。
最简单的解决方案是什么?
由于
答案 0 :(得分:3)
我觉得很可能实际上属于时区问题。 Date
对象及时代表即时 - 我怀疑如果你看一下你所获得的确切值(例如,在UTC中,为了保持清晰),你会得到一个更好的了解发生了什么。您可能会在“10/18/2011”看到它在不同的时区进行解释。
如果Spring支持转换为Joda Time类型,我建议使用它 - 那么您可以使用LocalDate
真正 表示日期而非即时
答案 1 :(得分:1)
我发现使用参数中指定的本地时区启动JVM可以解决此问题。对我来说,只是将这一行添加到运行配置中:
-Duser.timezone="Asia/Dhaka"