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

关于springboot时间的一些问题
文章图片

可以发现如果没有设置的话默认使用的时区是CST,可问题是CST是一个很复杂的时区。
科普一下:CST可以为如下4个不同的时区的缩写:
美国中部时间:Central Standard Time (USA) UT-6:00
澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
【关于springboot时间的一些问题】中国标准时间: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 格式化处理

    推荐阅读