最近项目里又发现一个问题,本地运行时间和服务器上的时区不一样,导致显示的时间不同,还有各种时间格式的问题。在这里整理一下。
统一时区
数据库连接url加上:
&useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8
然后在application启动类设置时区:
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
数据库时区
在mysql中查看关于时区的设置
show variables like '%time_zone%';
可以发现如果没有设置的话默认使用的时区是CST
,可问题是CST
是一个很复杂的时区。
科普一下:CST可以为如下4个不同的时区的缩写:
美国中部时间:Central Standard Time (USA) UT-6:00澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
中国标准时间:China Standard Time UT+8:00
古巴标准时间:Cuba Standard Time UT-4:00
这样的话我们就需要去修改一下,改成 +0:00,或者 +8:00,都是可以的。
--自MySQL 8.0 GA版本开始支持将参数写入并且持久化:
mysql> set persist time_zone='+0:00';
也可以直接修改配置文件
default-time-zone = '+8:00'
然后重启。
时间格式
SimpleDateFormat
和DateTimeFormatter
时间格式化
这个没什么说的,他们两的区别主要是一个不是线程安全,DateTimeFormatter
是线程安全的。
他们还可以设置时区
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
配置文件的设置
spring:
jackson:
# 格式化返回时间 yyyy-MM-dd HH:mm:ss
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
优点是统一, Controller 在返回数据时,会自动调用 Spring Boot 框架中内置的 JSON 框架 Jackson,对返回的数据进行统一的 JSON 格式化处理