gpt4 book ai didi

java - 如何在 spring-mvc 中跳过 jackson 时区校正?

转载 作者:行者123 更新时间:2023-12-01 19:55:01 26 4
gpt4 key购买 nike

我想配置 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。因此,jackson 会自动将任何数据库接收到的 java.sql.Timestamp 首先转换为 UTC(减去 2 小时),然后通过 json 输出它们。

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

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

我只想忽略时区而不进行对话。剪掉就好了。

最佳答案

方法#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

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

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

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

This class does not store or represent a time-zone. Instead, it is a description of the date, as used for birthdays, combined with the local time as seen on a wall clock. It cannot represent an instant on the time-line without additional information such as an offset or time-zone.

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

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 进行序列化字符串表示。如果您需要自定义格式,您可以使用自己的序列化器和反序列化器实现。请参阅documentation了解详情。

关于java - 如何在 spring-mvc 中跳过 jackson 时区校正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50045912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com