拓展阅读
MySQL 02 truncate table 与 delete 清空表的区别和坑
MySQL 03 Expression 1 of ORDER BY clause is not in SELECT list,references column
MySQL 04 EMOJI 表情与 UTF8MB4 的故事
MySQL 05 MySQL入门教程(MySQL tutorial book)
MySQL 06 mysql 如何实现类似 oracle 的 merge into
MySQL 08 datetime timestamp 以及如何自动更新,如何实现范围查询
MySQL 09 MySQL-09-SP mysql 存储过程
现象
页面显示的时候,却和当前时间差了 8 个小时。
后端:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
前端使用字符串接受
createTime: string;
问题分析
1)URL 设置
1) 服务器时间
因为日期的创建使用的是 new Date()
,所以确认了一眼服务器时间,时间正确。
2) URL 配置
在数据库链接上添加 serverTimezone=GMT%2B8
确认结果:url 中也设置了时区为上海。
UTC:Coordinated Universal Time 协调世界时。
GMT:Greenwich Mean Time 格林尼治标准时间。(在协调世界时意义上的0时区,即GMT = UTC+0)
中国的时间是【东八区】,比GMT多八个小时,即 GMT+8(或UTC+8,但习惯上还是用GMT+8)
3) 数据库值是否正确?
数据库存储值正确。
序列化的问题
debug 发现代码查询到的数据正确,但是序列化之后前端值错误。
于是猜测就剩下后端=》前端的序列化过程。jackson 序列化。
网上很多都是
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
但是实际上这里缺少了时区。
1) 可以统一修正:
将spring的json构造器的时区改正即可,在application.yml文件中添加:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
2) 单个指定
或者这样:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
private Date updateDate;
反思
针对这种前后端交互的数据,有时候 string 可能是最简单也不容易出错的形式。
最后个人选择了把类型设置为 String,后端统一格式化返回给前端的方式。
参考资料
https://www.jb51.net/database/3110399bu.htm
https://blog.csdn.net/weixin_44147535/article/details/135438169