LocalDateTime 默认序列化到 Redis 时丢失纳秒,因 Jackson 使用 ISO_LOCAL_DATE_TIME 格式器(仅到秒);需注册支持纳秒的 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS") 到 JavaTimeModule,并禁用 WRITE_DATES_AS_TIMESTAMPS。

LocalDateTime 默认序列化到 Redis 时丢失纳秒,本质是 Jackson 的 LocalDateTimeSerializer 在未显式指定格式器时,会使用 DateTimeFormatter.ISO_LOCAL_DATE_TIME(精度只到秒),而该格式器会截断纳秒部分(如 2025-06-15T14:30:45.123 → 丢掉后面的 456789 纳秒)。
确保纳秒级精度的序列化配置
关键在于:**必须用支持纳秒的 DateTimeFormatter,并在 JavaTimeModule 中注册对应的 Serializer/Deserializer**。ISO 标准格式本身支持纳秒(如 yyyy-MM-dd HH:mm:ss.SSSSSSSSS),但默认不启用。
- 推荐使用带 9 位纳秒的格式:
"yyyy-MM-dd HH:mm:ss.SSSSSSSSS"(注意是 9 个S) - 不能用
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")—— 这种写法连毫秒都不保留 - 避免依赖
@JsonFormat(pattern = "...")单字段注解,它容易与全局配置冲突,且无法保证反序列化兼容性
在 RedisConfig 中正确注册 JavaTimeModule
需在自定义 ObjectMapper 中注册带纳秒支持的模块,且 Serializer/Deserializer 必须成对配置:
- Serializer 使用
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS")) - Deserializer 使用
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS")) - 务必调用
objectMapper.registerModule(new JavaTimeModule()),否则自定义 serializer 不生效 - 禁用时间戳序列化:
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS),否则纳秒会被转成 long 值丢失可读性
验证纳秒是否真正保留
存入后直接从 Redis CLI 查看 value 值,应看到类似:{"updateTime":"2026-07-13 15:52:30.123456789"}
而不是 "2026-07-13T15:52:30" 或 "2026-07-13 15:52:30.123"(后者只到毫秒)。
- 若仍只有毫秒,检查是否误用了
SSS(仅毫秒)而非SSSSSSSSS - 若反序列化失败,确认 Deserializer 的 pattern 与 Serializer 完全一致,且无空格/大小写差异
- 注意:Redis 存储的是字符串,纳秒能否保留完全取决于 Jackson 序列化时的格式器,和 Redis 本身无关
补充说明:LocalDateTime 的纳秒存储限制
Java 的 LocalDateTime 内部纳秒精度为 0–999,999,999,Jackson 能完整保留;但实际业务中,多数数据库(如 MySQL 5.6+)和前端展示通常只用到毫秒。若非强需求(如高频金融、日志追踪),用 SSS(毫秒)更稳妥,兼容性更好。
立即学习“Java免费学习笔记(深入)”;


















