用户国营 发表于 2024-8-7 01:00:25

mysql中返回日期格式带有T、Java解决返回日期格式带 ‘T‘ 问题、MySQL查询

以下内容基于mysql8.0进行解说
一、场景描述:Mysql返回日期格式带有T

在springboot项目中,mysql数据库日期类型datetime、timestamp类型的日期字段,查询时返回的JSON相应报文中带有T.
(1)Springboot返回相应JSON报文如下:
{
    "id": 1,
    "createTime": "2024-06-18T08:54:41.000+00:00",
    "updateTime": "2024-06-18T08:54:41.000+00:00"
}
https://img-blog.csdnimg.cn/direct/670d0bc1170446a0b15a7796039cf916.png
(2)数据库表数据如下:
create table test
(
        ID int auto_increment comment 'id' primary key,
        CREATE_TIME datetime null comment '创建时间',
        UPDATE_TIME timestamp null comment '更新时间'
)
comment '测试表';

insert into test values (null,now(),now());
https://img-blog.csdnimg.cn/direct/f7b0cc07b5d24347adfd2472b22db10d.png
(3)springboot项目代码如下
https://img-blog.csdnimg.cn/direct/6d9127940a864defa99b4b31bfe7f792.png
二、解决方法

2.1、方法一:通过注解格式化

可以在日期类型属性上,或者 GET 方法加上 Jackson 的 @JsonFormat 注解方式来格式化,比方:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
留意: 肯定要在最外层Controller层中的相应实体上添加@JsonFormat 注解,否则不见效。
https://img-blog.csdnimg.cn/direct/5adec541ecf94b2d924856178cac55ec.png
效果:
https://img-blog.csdnimg.cn/direct/94fd81e0c451435b90f9bd2074af6f01.png
2.2、方法二:通过全局配置

@Configuration
public class WebMvcConfig {
    @Bean
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
      ObjectMapper mapper = new ObjectMapper();
      mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
      converter.setObjectMapper(mapper);
      return converter;
    }
}
2.3、方法三:查询时手动转换时间格式

(1):mapper.xml文件中使用DATE_FORMAT手动转换文件
<select id="listAll" resultType="com.demo.entity.vo.TestVo">
    select id,DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') create_time ,
         DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%s') update_time
    from test
</select>
(2):相应实体中用String类型进行吸收
https://img-blog.csdnimg.cn/direct/3d1eb861a96c47629bc5f847f24e4292.png
三、mysql 数据库时间类型数据为什么有T

在MySQL数据库中,日期和时间类型的数据被存储为特定的格式。当从数据库中查询日期时,有时会发现日期值带有字母"T",比方"2021-01-01T12:00:00"。这是由于MySQL遵循ISO 8601标准,在日期和时间之间使用"T"作为分隔符。
3.1、什么是ISO 8601格式

ISO 8601是国际标准化组织(ISO)发布的日期和时间的表示方法的标准。在ISO 8601中,日期和时间被表示为一个带有"T"的字符串,如"2022-01-01T12:00:00"。这种格式的好处是统一和标准化,便于不同系统之间的数据互换和比较。
   日期和时间的组合表示法编辑:


[*]归并表示时,要在时间前面加一大写字母T,如要表示北京时间2021年3月31日上午7点30分8秒,可以写成2021-03-31T7:30:08,以是这个T date和time归并表示时,中间加个T。
iso 8601详情查看:https://baike.baidu.com/item/ISO%208601/3910715?fr=ge_ala
四、java中日期格式带T

我一直有个疑问,前面我们讲mysql中datetime、Timestamp类型返回的Date类型会带T, 那么java本身的java.util.Date类本身会带T么?
(1)案例
https://img-blog.csdnimg.cn/direct/49083334cabd4b2b8ce310d89cdb1beb.png
(2)效果
可以发现在相应报文中,new Date()也是带有T的。
https://img-blog.csdnimg.cn/direct/a1673035357e45828ea201d22016bb8f.png
https://img-blog.csdnimg.cn/direct/0c208d6046fb41c3a88c0f5361fab9ec.png
(3)结论
只要java中返回对象是java.util.Date, 默认都会带T, 不但仅是由于mysql数据库字段类型为datetime、timestamp
4.1、疑问:为什么java.util.Date类型返回时带T

   有个疑问,我们直接在程序中打印new Date()的时间显示的是Wed Jun 19 09:05:56 CST 2024样式,为什么在相应JSON中转换成了2024-06-19T01:48:07.337+00:00格式

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: mysql中返回日期格式带有T、Java解决返回日期格式带 ‘T‘ 问题、MySQL查询