【经验】java时区问题

首先得有一个预备知识

时间戳:指1970-01-01 00:00:00(GMT/UTC)起到当前的毫秒数。与时区无关,不同时区同一个时刻的时间戳是相同的。所以,时间戳不受时区影响。但是,不同时区的国家同一个时间戳显示的日期不同,所以同一时刻的时间戳表示的日期会受时区影响。

一、MySQL数据库连接时区问题

1.jdbc连接时设置serverTimezone。

由于后台生成properties文件jdbc连接并没有区分国内外服务器时区,统一用的中国时区Asia/Shanghai,所以库timestamp类型字段都显示成了国内的时间。

解决办法:如果项目并没有上线,则可以使用JDK的默认时区,设置serverTimezone为JDK的默认时区

java 复制代码
ZoneId.systemDefault();

也是系统的时区,这样保证了数据库timestamp字段日期跟系统保持一致;如果项目上线后,则不能修改,保持不变。修改后后会影响原来的涉及日期的逻辑。 如果有操作系统时区会更变的情况下,需要程序监听时区的变化。重设默认时区。

2.jdbc连接时不设置serverTimezone。

会有JDK,MySQL关于CST标准冲突导致的时区问题。

当未设置serverTimezone时,数据库将连接使用MySQL服务端的time_zone(全局时区),默认值为CST。time_zone的默认值为SYSTEM,而SYSTEM取的是system_time_zone(系统时区)的值,system_time_zone的默认值就是CST。

MySQL中,CST表示的是:中国标准时间(UTC+08:00)。

JDK中,CST表示的是:美国标准时间(UTC-05:00或UTC-06:00)。

由于JDK和MySQL服务端对CST时区的不同标准(可能是下载的地址版本不同),会导致时间问题。

解决办法:jdbc连接时设置serverTimezone。

二、夏冬令时变化导致的时区问题

在程序中,如果涉及天数的计算,需要根据实际情况选择不同的计算规则。如果要用日期,则全部用日期为标准计算;如果要用时间戳,则全部用时间戳为标准计算。检查使用的每一个时间工具,计算是用的日期还是时间戳。否则会由于夏冬令时的变化导致时区问题。

比如,在hutool工具中,DateUtil工具中offsetDay方法,计算偏移30天后的日期,是根据时区为标准获得的日期。如果初始日期是冬令时某天的零点,偏移天数后的日期是夏令时某天的零点,但是由于转变为夏冬令时会让日期直接快/慢一个小时,导致前后的时间在当前时区的时间戳,跟以时间戳为标准计算天数的betweenDay方法,计算出来的天数不同。

相关推荐
月夕·花晨3 分钟前
Gateway -网关
java·服务器·分布式·后端·spring cloud·微服务·gateway
失散134 分钟前
分布式专题——6 Redis缓存设计与性能优化
java·redis·分布式·缓存·架构
杏花春雨江南4 分钟前
Spring Cloud Gateway 作为一个独立的服务进行部署吗
java·开发语言
GSDjisidi5 分钟前
东京本社招聘 | 财务负责人 & 多个日本IT岗位(Java/C++/Python/AWS 等),IT营业同步招募
java·开发语言·aws
skywalk81636 分钟前
copyparty 是一款使用单个 Python 文件实现的内网文件共享工具,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景
开发语言·python
BYSJMG11 分钟前
计算机毕设选题:基于Python+MySQL校园美食推荐系统【源码+文档+调试】
大数据·开发语言·python·mysql·django·课程设计·美食
Zz_waiting.16 分钟前
案例开发 - 日程管理 - 第七期
开发语言·前端·javascript·vue.js·html·路由
叫我阿柒啊16 分钟前
Java全栈开发面试实战:从基础到微服务的完整技术栈解析
java·spring boot·微服务·前端框架·vue·jwt·全栈开发
writeone16 分钟前
9-10关于JS初学产生的问题
开发语言·javascript·ecmascript