首页 > 解决方案 > 如何在 spring-mvc 中跳过杰克逊时区校正?

问题描述

我想配置jackson为使用以下格式输出任何日期/时间值:

spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss

我正在获取许多数据库行并将它们作为json地图返回。

@RestController
public class MyService {
    @GetMapping
    public List<Map<String, Object>> get(Param params) {
             return jdbcTemplate.queryForList(sql, params);
    }
}

问题:数据库和 jvm 默认时区是Europe/Berlin,因此是 UTC+2。因此,杰克逊java.sql.Timestamp首先自动将任何数据库接收到的转换为 UTC(减去 2 小时),然后通过 json 输出它们。

mysql数据库本身中,它是一种datetime类型。

但我只想让杰克逊“按原样”输出时间戳,无需事先转换!是否可以跳过时区校正?

我只想在没有对话的情况下忽略时区。把它剪掉。

标签: javaspringspring-mvcjackson

解决方案


方法 #1:设置默认时区

您可以以 . 使用的日期格式设置时区ObjectMapper。它将用于Date和子类:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(dateFormat);

在 Spring 应用程序中,要配置ObjectMapper,您可以执行以下操作:

@Bean
public ObjectMapper objectMapper() {

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

    ObjectMapper mapper = new ObjectMapper();
    mapper.setDateFormat(dateFormat);
    return mapper;
}

在 Spring Boot 中,您可以使用该属性spring.jackson.time-zone来定义时区:

spring.jackson.time-zone: Europe/Berlin

有关常见应用程序属性的更多详细信息,请参阅文档

方法 #2:使用 Java 8 日期和时间 API

而不是使用Timestamp,您可以考虑LocaDateTimeJSR-310。它是在 Java 8 中引入的。“本地”日期和时间类(LocalDateTimeLocalDateLocalTime不依赖于任何一个地区或时区。从LocalDateTime文档中:

此类不存储或表示时区。相反,它是对日期的描述,用于生日,结合挂钟上的当地时间。如果没有诸如偏移或时区之类的附加信息,它就不能代表时间线上的瞬间。

答案将为您提供有关新日期和时间类的更多详细信息。

Jackson 有一个支持 JSR-310 类型的模块。将其添加到您的依赖项中:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9</version>
</dependency>

然后在您的实例中注册JavaTimeModule模块:ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

大多数 JSR-310 类型将使用标准ISO-8601字符串表示进行序列化。如果需要自定义格式,可以使用自己的序列化器和反序列化器实现。有关详细信息,请参阅文档


推荐阅读