Spring @DateTimeFormat 正在更改时区,同时将 @PathVariable 转换为 Date

Sur*_*jaj 5 java rest spring spring-mvc datetime-format

@PathVariable使用@DateTimeFormat. 自动转换完成,但由于某种原因,日期被转换为我过去减去四小时的日期(复活节夏令时,服务器和客户端都位于那里)。

例子:

URL:.../something/04-10-2016/somename将产生值为 2016/10/03 20:00:00 的 someDate 对象(即前一天的晚上 8 点,比我通过的日期晚 4 小时。)

如何避免这种自动时区转换。我不需要任何时区信息,这种转换打破了我预期的行为。

这是我的代码:

@RequestMapping(value = "/something/{someDate}/{name}", method = RequestMethod.GET, headers = "Accept=application/json")
@ResponseBody
public SomeObject getDetails(@PathVariable @DateTimeFormat(pattern = "dd-MM-yyyy") Date someDate,
    @PathVariable String name) {
    // date here comes as GMT - 4
    // more code here
    // return someObject;
}
Run Code Online (Sandbox Code Playgroud)

现在,我通过将路径变量作为字符串读取并使用 SimpleDateFormatter 手动将字符串转换为日期来解决这个问题。

关于如何在没有时区转换的情况下进行自动转换工作的任何想法?

kuh*_*yan 5

问题的原因可能是时区, java.util.Date 即时时间被转换回东部时区,因此您会看到该值。如果您使用的是 Java 8,LocalDate 应该会为您解决问题。

@PathVariable @DateTimeFormat(pattern = "dd-MM-yyyy") LocalDate date
Run Code Online (Sandbox Code Playgroud)

以下为您整齐地发布了一些选项

https://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-parsing-date-and-time-information-from-a-request-parameter/


Sur*_*jaj 1

Do Nhu Vy 的回答指出了正确的方向;但我不得不删除它,而不是添加时区信息。

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

从配置中删除了它并保留默认时区。这对我有用。