Mybatis(JsonFormat)+PostgreSQL:提取的时间与实际存储时间不同

1、问题描述

近期在SpringBoot+Mybatis的项目中发现从数据库选择出来的时间记录对不上实际时间。我的数据库使用的是PostgreSQL,其中有一些表使用了timestamp(6) without time zone字段来存储时间,在Mybatis映射时为了能够满足中国时区时间与时间格式的统一在JavaBean的时间属性上使用@JsonFormat注解。但是出现了诡异的情况:选择返回的时间与数据库存储记录的时间对不上。

如:

数据库存储的记录:
create_time: 2021-02-13 12:14:49

经Mybatis提取并返回前端的Json:
"createTime":"2021-02-13 12:02:00"

2、解决问题

经过一步步排查之后,发现问题可能出现在@JsonFormat注解pattern字段上。

原代码

@JsonFormat(pattern = "yyyy-MM-dd HH:MM:SS", timezone = "GMT+8")
private Date createTime;

修改后的代码

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

3、原因剖析

yyyy-MM-dd HH:MM:SS这种日期格式并不合适:在分钟位使用MM,解析时会被误以为是月份,从而将14分解析为02【12+2个月】,而在秒钟位使用SS,解析时并无法解析,因此无论什么时间都是00。

4、时间字符串格式说明

常用格式:
yyyy-MM-dd HH:mm:ss 24小时制
yyyy-MM-dd hh:mm:ss 12小时制

字段说明
y不包含纪元的年份。不具有前导零。
yy不包含纪元的年份。具有前导零。
yyyy包括纪元的四位数的年份。
M月份数字。一位数的月份没有前导零。
MM月份数字。一位数的月份有一个前导零。
MMM月份的缩写名称,在 AbbreviatedMonthNames 中定义。
MMMM月份的完整名称,在 MonthNames 中定义。
d月中的某一天。一位数的日期没有前导零。
dd月中的某一天。一位数的日期有一个前导零。
ddd周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
dddd周中某天的完整名称,在 DayNames 中定义。
gg时期或纪元。
h12 小时制的小时。一位数的小时数没有前导零。
hh12 小时制的小时。一位数的小时数有前导零。
H24 小时制的小时。一位数的小时数没有前导零。
HH24 小时制的小时。一位数的小时数有前导零。
m分钟。一位数的分钟数没有前导零。
mm分钟。一位数的分钟数有一个前导零。
s秒。一位数的秒数没有前导零。
ss秒。一位数的秒数有一个前导零。
f秒的小数精度为一位。其余数字被截断。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Oruizn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值