如何在映射到控制器请求对象的同时将时区偏移量的json日期转换为UTC

时间:2019-01-30 12:10:36

标签: java spring spring-boot jackson jackson2

我正在使用Spring Boot应用程序,并且在JSON请求中有一个带时区偏移量的日期(1968-07-21T23:00:00.000 + 02:00),并且它已映射到LocalDateTime对象,该对象是包装对象没有任何问题。但是我希望日期在映射到控制器中的此请求对象时可以动态调整为UTC。因此,在控制器中获取请求包装对象之后,该日期的值应为“ 1968-07-22T01:00:00.000 + 00:00”,日期和时间会自动调整。

我为此尝试了几件事,但没有任何效果,到目前为止,我尝试过的事情如下:

方法1:由于我使用的是Jackson 2,因此我在DTO日期字段中添加了以下注释

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone="UTC")

方法2:我尝试如下自定义Jackson2ObjectMapperBuilderCustomizer。

@Bean
public Jackson2ObjectMapperBuilderCustomizer init() {
return new Jackson2ObjectMapperBuilderCustomizer() {
  @Override
  public void customize(Jackson2ObjectMapperBuilder builder) {
    builder.timeZone(TimeZone.getTimeZone(ZoneOffset.UTC));
  }
 };
}

但是以上两种方法都不适合我。请让我知道是否还有其他方法可以实现此目的。预先感谢。

2 个答案:

答案 0 :(得分:0)

LocalDateTime是没有时区的DateTime字段。

摘自文档:

  

ISO-8601日历系统中没有时区的日期时间,例如2007-12-03T10:15:30。

改为使用ZonedDateTime。

  

ISO-8601日历系统中带有时区的日期时间,例如2007-12-03T10:15:30 + 01:00欧洲/巴黎。

javadoc

答案 1 :(得分:0)

使用java.text类来完成这项工作。

例如

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String date = format.format(new Date());

然后将其发送到您的用例。