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

Nic*_*ack 6 java spring date spring-mvc

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

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

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date myDate 
Run Code Online (Sandbox Code Playgroud)

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

Sot*_*lis 9

这里有几件事情在玩.

首先,Spring @DateTimeFormat在注释java.util.Date字段或参数时使用SimpleDateFormat其时区设置为UTC.

其次,你用过DateTimeFormat.ISO.DATE哪个代表

最常见的ISO日期格式yyyy-MM-dd,例如"2000-10-31".

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

第三,你提供了一个日期字符串,除了iso模式之外的所有内容都会被忽略.该SimpleDateFormat只关心2017-01-24的部分.

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

最后,由于您系统的默认时区是中央标准时间,即.UTC-6),当你调用toStringDate对象时,它将返回一个String用该时区格式化的对象,即.午夜6点前.


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


要"修复"这个,@DateTimeFormat用适当的方法构建你的pattern时间和时区.我会用

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