文章目录
- 一、场景描述:Mysql返回日期格式带有T
- 二、解决方法
- 2.1、方法一:通过注解格式化
- 2.2、方法二:通过全局配置
- 2.3、方法三:查询时手动转换时间格式
- 三、mysql 数据库时间类型数据为什么有T
- 3.1、什么是ISO 8601格式
- 四、java中日期格式带T
- 4.1、疑问:为什么java.util.Date类型返回时带T
以下内容基于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格式