我有一个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日。为什么它会改变我的约会对象?
答案 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'”。