springboot如何统一设置时区

目录
  • springboot 统一设置时区
  • springboot mysql 时区问题总结
    • 寻找原因
    • 词义
    • 几种情况
  • 总结

springboot 统一设置时区

控制springboot服务的时区为东八区

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    // 设置时区为上海时区,即东八区
    TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.SHORT_IDS.get("CTT")));
    SpringApplication.run(Application.class, args);
  }
}

以下是测试例子

springboot 启动时候设置时区,如下代码所示

@SpringBootApplication
public class EwPbServerApplication {

    public static void main(String[] args) {
        TimeZone timeZone = TimeZone.getTimeZone("UTC");
        TimeZone.setDefault(timeZone);
        SpringApplication.run(EwPbServerApplication.class, args);
    }
}

测试请求接口获取时间

    @GetMapping("test")
    @ApiOperation(value = "测试时间", httpMethod = "GET")
    public void test() {
        //当前时间为 2022-09-06 17:46
        //启动类设置时区后,获取当前时间
        Date date = new Date();
        DateTime date1 = DateUtil.date();
        LocalDateTime localDateTime = LocalDateTime.now();
        //设置时区为-东八区
        LocalDateTime.now(ZoneId.of("Asia/Shanghai"))

        log.info("date=={}", date);
        log.info("date1=={}", date1);
        log.info("localDateTime=={}", localDateTime);
        log.info("now=={}", now);
//        2022-09-06 09:47:01.385  xxxx  : date==Tue Sep 06 09:47:01 UTC 2022
//        2022-09-06 09:47:01.385  xxxx  : date1==2022-09-06 09:47:01
//        2022-09-06 09:47:01.386  xxxx  : localDateTime==2022-09-06T09:47:01.381
//        2022-09-06 09:47:01.386  xxxx  : now==2022-09-06T17:47:01.385
    }

由测试结果得知,springboot 启动时设置时区之后全局生效,但是优先级小于手动设置

springboot mysql 时区问题总结

寻找原因

后端开发中常见的几个时区设置

第一个设置点配置文件   spring.jackson.time-zone

第二个设置点 高版本SpringBoot版本 mysql-connector-java 用的是8.X,mysql8.X的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空。

第三个设置点 mysql  time_zone变量

词义

serverTimezone临时指定mysql服务器的时区

spring.jackson.time-zone  设置spring默认时区

system_time_zone mysql服务器时区 ,time_zone默认System追随system_time_zone

几种情况

1、time_zone 为 System,serverTimezone为GMT+8,jackson.time-zone未定义

插入情况

再查询此条记录

个人觉得Spring默认时区为格林尼治时区,web服务器当前时区为东八区,进行加8操作。

2、set GLOBAL time_zone = '+3:00',serverTimezone为GMT+8,jackson.time-zone为GMT+8

createTime 为 timestamp类型

修改配置后,需要重启SpringBoot

新增情况

数据库中显示

查询记录

个人理解,serverTimezone设置覆盖掉了mysql的time_zone变量,跟SpringBoot会话时区还是东8

3、上述环境,不重启SpringBoot,直接改变time_zone = '+5:00'

改变后,上条记录往后调整2小时。

SpringBoot查询,一样

说明,timeStamp类型存储的是格林尼治时间,加上time_zone时区

当time_zone变化时,会话没结束,serverTimeZone东8还是对应time_zone的东3

SpringBoot插入

个人理解,serverTimeZone东8 还是和 time_zone 东3对应,但是插入发现 当前time_zone已经改成东5,就加2小时。

重启SpringBoot,重新查询

虽然,mysql变量time_zone为+5,但是重启后,serverTimeZone直接覆盖,设置时间区间为东8

重新把time_zone改回东3

改回重新打开表,发现又回来了

不启动SpringBoot,查询数据,还是老样子

此时,添加一条数据。

往前推了2小时。

SpringBoot查询

重启SpringBoot,查出来就是库中数据。

4、serverTimezone为GMT,jackson.time-zone为GMT+8,time_zone为东3

serverTimeZone为格林尼治时间,web服务器为东八,所以直接推迟8小时

取出来刚好反一下,显示正常。

此时,修改serverTimeZone为东八。

5、时间字段类型为timestamp,使用默认current_timestamp,  serverTimezone为GMT,jackson.time-zone为GMT+8,time_zone为东3

因mysql时区东三时间为

插入后数据为

但是serverTimeZone为格林尼治时间,jackson.time-zone为东八,加8小时

6、时间字段类型为datetime,serverTimezone为GMT+8,jackson.time-zone为GMT+8,time_zone为东3

插入

库中

查询

time_zone从东3修改为东5

重新打开库

不启动SpringBoot

重启SpringBoot,还是一样。

修改serverTimeZone为GMT,其他不改动

查询

总结

jackson.time-zone管前端到web服务器 转换的时区。

如果是时间类型为datetime,serverTimeZone说了算。

如果时间类型为timestamp

1、当time_zone和serverTimeZone不统一情况,会话中,表中时间数据,按照serverTimeZone设定

2、如果过程中,修改了time_zone变量,库中数据直接变更。但是不影响当前会话查询,新增数据,就会根据time_zone调整量,调整实际入库。

3、SpringBoot重启,其实就是新会话。情况同上_1。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot:JPA + AuditingEntityListener时区设置方式

    目录 JPA + AuditingEntityListener时区设置 可在应用配置中添加如下配置 @EntityListeners(AuditingEntityListener.class)介绍 @EntityListeners AuditingEntityListener.class JPA + AuditingEntityListener时区设置 在SpringBoot项目中,如果应用启用了EnableJpaAuditing并且使用AuditingEntityListener对实体的创建时

  • 关于SpringBoot mysql数据库时区问题

    寻找原因 后端开发中常见的几个时区设置 第一个设置点配置文件   spring.jackson.time-zone 第二个设置点 高版本SpringBoot版本 mysql-connector-java 用的是8.X,mysql8.X的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空. 第三个设置点 mysql  time_zone变量 词义 serverTimezone临时指定mysql服务器的时区 spring.jackson.time-zone  设置spri

  • SpringBoot中 Jackson 日期的时区和日期格式问题解决

    目录 1.使用场景 1.1.数据库MySQL也是有时区的概念的. 1.2.系统时区意味着与计算机的操作系统时区相同. 1.2.SpringBoot默认的Json视图转换框架Jackson也有时区概念 2.代码实现 2.1.解决方案一下在每个带有日期地方加上注解 2.2.只需要配置一个bean实现整体修改 2.3.使用SpringBoot的配置方式 3.成果展现 4.总结 1.使用场景 因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法语.英语.简体中文).我们的项目部署环境

  • springboot如何统一设置时区

    目录 springboot 统一设置时区 springboot mysql 时区问题总结 寻找原因 词义 几种情况 总结 springboot 统一设置时区 控制springboot服务的时区为东八区 @SpringBootApplication public class Application {   public static void main(String[] args) {     // 设置时区为上海时区,即东八区     TimeZone.setDefault(TimeZone.g

  • springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

    1.新建项目 利用idea创建一个父项目,三个子项目,其中一个项目为生产者,一个项目为消费者,一个为接口等公共服务项目,生产者和消费者需要有web依赖,可以作为tomcat容器启动. 2.项目依赖 <dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <v

  • PHP中设置时区方法小结

    找到原因后,在网上搜索到了一些关于PHP的时区设置方法: 1.修改php.ini,在php.ini中找到data.timezone =去掉它前面的;号,然后设置data.timezone = "Asia/Shanghai";即可. 2.在程序PHP 5以上版本的程序代码中使用函数ini_set('date.timezone','Asia/Shanghai');或者date_default_timezone_set('Asia/Shanghai'); 一些常用的时区标识符说明: Asia

  • SpringBoot如何统一配置bean的别名

    这篇文章主要介绍了SpringBoot如何统一配置bean的别名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 所谓别名, 就是在mappper.xml配置文件中像什么resultType="xxx" 不需要写全限定类名, 只需要写类名即可. 配置方式有两种: 1. 在 application.yml中 #mybatis相关配置 mybatis: type-aliases-package: com.zzuli.domain 2. 在a

  • laravel 实现设置时区的简单方法

    众所周知 laravel 和 php 一样 默认的是英国的格林尼治时间 和我们相差大概8小时 laravel 框架其实 内置了设置时区的方式 打开 config 下的 app.php 找到 'timezone' 把UTC 改为 PRC 即可 以上这篇laravel 实现设置时区的简单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • springboot+idea热启动设置方法(自动加载)

    springboot+idea热启动 1.在pom.xml中引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> 然后在build/plugins/plugin中设置

  • PHP date_default_timezone_set()设置时区操作实例分析

    本文实例讲述了PHP date_default_timezone_set()设置时区操作.分享给大家供大家参考,具体如下: <?php echo function_exists(date_default_timezone_set)."<br>";//在这他总是返回1,这函数是判断这里面的字符是不是一个定义了的函数名 echo date('Y-m-d H:i:s')."<br>";//默认时区的时间 echo date_default_t

  • IntelliJ IDEA 统一设置编码为utf-8编码的实现

    问题一: File->Settings->Editor->File Encodings 问题二: File->Other Settings->Default Settings ->Editor->File Encodings 问题三: 将项目中的.idea文件夹中的encodings.xml文件中的编码格式改为uft-8 问题四: File->Settings->Build,Execution,Deployment -> Compiler -&g

  • Spring Cloud Feign统一设置验证token实现方法解析

    我们也在zuul中通过前置过滤器来统一设置token, 其实还漏掉了一种,那就是业务服务调用业务服务的时候,是没有zuul这种前置过滤器的,那么我们该如何设置呢? 其实也挺简单的,因为我们服务之前的调用是依赖于Feign的,我们可以从Feign上来做文章. 如果你仔细看过Feign的文档的话,肯定会注意到下面一段代码: static class DynamicAuthTokenTarget<T> implements Target<T> { public DynamicAuthTo

  • Springboot居然可以设置动态的Banner(推荐)

    先给小火伴们留个悬念 嘿嘿 文末有神秘代码~ (大家可以猜猜用来干嘛滴先!) 嘿嘿 不知道过年这两天大家过得怎样呀~ 比如 春晚抢到了多少红包呀?

随机推荐