You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot中LocalDateTime JSON格式化正常但数据库存储格式不符

问题分析与解决方案

首先要明确核心认知:MySQL的datetime/timestamp类型并不存储日期时间的显示格式,它是以内部二进制格式存储的,你通过select语句看到的格式只是MySQL客户端默认的输出格式,并非实际存储的格式。你的@CreatedDate注解仅负责自动填充创建时间的数值,不会影响存储格式,也不是问题的根源。

你用到的注解的实际作用:

  • @JsonFormat:仅控制Jackson对JSON的序列化/反序列化逻辑,所以你的API响应和请求中的日期格式符合预期,这是正常表现。
  • @DateTimeFormat:用于Spring处理请求参数(如URL参数、表单数据)的格式绑定,和数据库存储完全无关。
  • @CreatedDate:Spring Data JPA提供的自动填充创建时间的注解,仅负责为字段赋值,不涉及格式转换。

实现需求的可行方案:

如果你希望查询结果显示为指定的dd/MM/yyyy HH:mm:ss.SSS格式,推荐以下两种方式:

1. 查询时用MySQL函数动态转换格式

在SQL查询中使用DATE_FORMAT函数将日期转换为指定格式,注意MySQL的格式占位符规则:

SELECT 
    id, 
    DATE_FORMAT(created_date_time, '%d/%m/%Y %H:%i:%s.%f') AS created_date_time 
FROM card;

注:%f会输出6位微秒,若只需要3位毫秒,可通过字符串截取处理:

SELECT 
    id, 
    CONCAT(DATE_FORMAT(created_date_time, '%d/%m/%Y %H:%i:%s'), 
           '.', SUBSTRING(MICROSECOND(created_date_time), 1, 3)) AS created_date_time 
FROM card;

2. 修改MySQL客户端的默认显示格式

若希望所有查询的日期都默认显示为指定格式,可修改MySQL配置文件(如my.cnf或my.ini),添加以下配置:

[mysqld]
datetime_format = '%d/%m/%Y %H:%i:%s.%f'

[mysql]
datetime_format = '%d/%m/%Y %H:%i:%s.%f'

修改后重启MySQL服务,客户端查询时就会默认使用该格式显示日期。

不推荐的方案:将日期存为字符串

不要将数据库字段类型改为VARCHAR来存储格式化后的日期字符串,这种做法会丢失日期类型的核心优势:无法直接进行日期排序、区间查询、计算(如加减天数),还会浪费存储空间并降低查询性能。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:17:33