关于springboot的一些时间问题
最近项目里又发现一个问题,本地运行时间和服务器上的时区不一样,导致显示的时间不同,还有各种时间格式的问题。在这里整理一下。
统一时区
数据库连接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 格式化处理
