那为什么Date的属性会被序列化为yyyy-MM-dd HH:mm:ss
时间: 2025-07-05 08:07:55 浏览: 0
### Jackson 序列化 Date 时格式不一致的原因
Jackson(`ObjectMapper`)在序列化 `Date` 类型字段时,默认使用的是 `StdDateFormat`,它支持多种 ISO 8601 格式,例如 `"yyyy-MM-dd'T'HH:mm:ss.SSSZ"` 和 `"EEE, dd MMM yyyy HH:mm:ss zzz"`。然而,在某些场景下,实际输出的日期格式为 `"yyyy-MM-dd HH:mm:ss"`,而不是期望的 `"yyyy-MM-dd'T'HH:mm:ss.SSS"`。这种差异通常是由以下原因导致的:
#### 1. 自定义配置覆盖了默认行为
如果在应用中显式地设置了 `ObjectMapper` 的日期格式,例如通过 `SimpleDateFormat` 或 `Jackson2ObjectMapperBuilderCustomizer` 配置了 `"yyyy-MM-dd HH:mm:ss"`,那么 `ObjectMapper` 将按照该格式进行序列化和反序列化操作。这会覆盖 Jackson 默认支持的 ISO 8601 格式[^3]。
```java
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.timeZone(TimeZone.getDefault());
};
}
```
上述配置会导致所有 `Date` 类型字段在序列化时使用 `"yyyy-MM-dd HH:mm:ss"` 格式,而不是 `"yyyy-MM-dd'T'HH:mm:ss.SSS"`。
#### 2. Java 8 时间 API 的解析方式不同
当使用 `LocalDateTime` 而不是 `Date` 时,Jackson 默认不会使用 `SimpleDateFormat`,而是依赖于 `JavaTimeModule` 提供的 `LocalDateTimeDeserializer` 和 `LocalDateTimeSerializer`。如果没有正确注册自定义的 `DateTimeFormatter`,Jackson 可能会根据输入字符串自动选择最匹配的格式,从而导致与预期不符的结果[^4]。
可以通过如下方式显式指定 `LocalDateTime` 的序列化/反序列化格式:
```java
ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule module = new JavaTimeModule();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
objectMapper.registerModule(module);
```
#### 3. Spring Boot 中的默认时间序列化策略
Spring Boot 默认启用了 `WRITE_DATES_AS_TIMESTAMPS` 特性,即将日期写入为时间戳形式(如 `1696527000000`),而不是格式化的字符串。如果关闭了该特性,则需要确保 `ObjectMapper` 使用了正确的日期格式器来生成 `"yyyy-MM-dd'T'HH:mm:ss.SSS"` 格式的字符串。
```java
@Bean
public ObjectMapper serializingObjectMapper() {
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer deserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
module.addDeserializer(LocalDateTime.class, deserializer);
return Jackson2ObjectMapperBuilder.json()
.modules(module)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
}
```
#### 4. 不同 JSON 库之间的兼容性问题
FastJSON 和 Jackson 在处理日期类型时采用不同的默认格式。FastJSON 默认使用 `"yyyy-MM-dd HH:mm:ss"`,而 Jackson 默认支持 ISO 8601 格式。如果前后端或微服务之间分别使用不同的库进行序列化/反序列化,可能会导致解析失败。因此,若发现 Jackson 输出的格式与预期不符,可能是因为受到其他组件的影响,例如 Feign 客户端、RestTemplate 或外部接口调用方的默认设置[^2]。
---
阅读全文
相关推荐


















