关于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'

然后重启。

时间格式

SimpleDateFormatDateTimeFormatter时间格式化

这个没什么说的,他们两的区别主要是一个不是线程安全,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 格式化处理

你可能感兴趣的:(springbootmysql)