以下内容基于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"
- }
复制代码
(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());
复制代码
(3)springboot项目代码如下
二、解决方法
2.1、方法一:通过注解格式化
可以在日期类型属性上,或者 GET 方法加上 Jackson 的 @JsonFormat 注解方式来格式化,比方:
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date updateTime;
复制代码 留意: 肯定要在最外层Controller层中的相应实体上添加@JsonFormat 注解,否则不见效。
效果:
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类型进行吸收
三、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)案例
(2)效果
可以发现在相应报文中,new Date()也是带有T的。
(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企服之家,中国第一个企服评测及商务社交产业平台。 |