Spring的@DateTimeFormat在前一天生成一个Date对象

时间:2017-01-27 19:33:48

标签: java spring date spring-mvc

我有一个requestParam接受日期(即2017-01-24T06:00:00.000Z)。

我正在使用DateTimeFormat将其格式化为传递到我的控制器的日期。

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date myDate 

但是当我将myDate打印到我的控制台时,我得到了“2017年1月23日,18:00:00 CST 2017”,但在上面的例子中,它应该是1月24日。为什么它会改变我的约会对象?

2 个答案:

答案 0 :(得分:8)

这里有几件事情在发挥作用。

首先,Spring @DateTimeFormat,在注释java.util.Date字段或参数时uses a SimpleDateFormat with its timezone set to UTC

其次,您使用了代表

DateTimeFormat.ISO.DATE
  

最常见的ISO日期格式yyyy-MM-dd,例如“2000-10-31”。

换句话说,它不会考虑您的日期字符串中的任何时区信息(这并不重要,因为您的日期字符串无论如何根植于Zulu)。

第三,您提供了一个日期字符串,其中除了iso模式之外的所有内容都会被忽略。 SimpleDateFormat仅关注2017-01-24部分。

由于时区设置为UTC,因此它将2017-01-24日期视为以UTC,午夜,零小时,分钟和秒为根。

最后,由于您系统的默认时区是中央标准时间,即。 UTC-6),当您在Date对象上调用toString时,它将返回使用该时区格式化的String,即。午夜6点前。

还要记住,Date没有时区概念。这是一个时间戳。

要“修复”此问题,请使用适当的pattern构建@DateTimeFormat,以解释时区和时区。我会用

@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX") Date myDate 

答案 1 :(得分:0)

如果您想配置一般时区,您可以使用以下内容:

 spring.jackson.time-zone=EST

documentation 表示:“格式化日期时使用的时区。例如,'America/Los_Angeles' 或 'GMT+10'”。