前提
数据库时区:GMT+8
show variables like '%time_zone%';
本机电脑时区:
情景一、不指定时区
传递的参数映射到Data不指定时区,连接数据库不指定时区,保存时间以及获取时间如下:
- 保存时间
传递的参数:
{ "date":"2019-11-23T18:30:00" }
注备:GMT 格林威治时间 ,UTC 标准时间,ISO 标准时间,CST 北京时间 ,GMT = UTC ,例如 GMT+8 = UTC+8
时间相差了 8消失,想要保存的是23日6点半,实际保存的是24日2点半。系统日志打印的也是相差了8小时。
测试01:修改计算机时区
再次测试保存时间
系统与数据库并不受影响,所以系统时间不会影响。如果不指定时区,程序默认使用 CST 中国时区显示在控制台。而接收的时间默认是 GMT+0
由于认为输入的时区是0 区,而保存的是+8 区,所以快了8小时
获取时间:
{ "id": 29, "date": "2019-11-23T18:30:00.000+0000" }
获取时间是正确的,没有指定时区,获取的时区是数据库GMT8 区是时间,转换为对象会没有指定时区是GMT 0区,减去8小时显示
情景二、指定数据库连接时区
url: jdbc:mysql://localhost:3306/test?serverTimeZone=GMT+10
测试证明,连接时区对存储日期不受影响
获取时间:
测试证明,连接时区对获取时间没有影响
此处留作疑问
情景三、指定json 映射时区
spring:
jackson:
time-zone=GMT+5
存储测试:
{ "date":"2019-11-23T18:30:00" }
系统显示:
系统日志显示北京时间23日9点半,比存入时间快了3小时。数据库也是快了3小时。那么当指定时区时,系统不再使用 0 区,而是将输入的时间表有时区。
获取测试:
结果
[ { "id": 34, "date": "2019-11-23T23:30:00.000+0500" }, { "id": 35, "date": "2019-11-23T23:30:00.000+0500" }, { "id": 36, "date": "2019-11-23T18:30:00.000+0500" } ]
只有最后一个时间是正确的,之前的时间都是错误的。
错误分析:从数据库获取的时间是+8 区是时间,现在指定了json 时区,前2者是按0区存储的,现在显示的转换为+5区,导致错误偏移了5小时。
情景四、设置全局时区,且设置了json 时区
TimeZone.setDefault(TimeZone.getTimeZone("GMT+5"));
在启动类上加入时区代码,保存测试
{ "date":"2019-11-23T18:30:00" }
获取测试:
[ { "id": 34, "date": "2019-11-23T23:30:00.000+0500" }, { "id": 35, "date": "2019-11-23T23:30:00.000+0500" }, { "id": 36, "date": "2019-11-23T18:30:00.000+0500" }, { "id": 37, "date": "2019-11-23T18:30:00.000+0500" } ]
测试证明,全局时区只是显示的控制控制台打印的时间,不会影响其他