springboot web项目统一时区方案

news2024/12/23 23:33:04

背景

springboot项目国际化中,会遇到用户选择的时间和最终存到数据库的时间不一致,可能就是项目开发和部署时的时区没有处理好,导致时间转换出现了问题。

先了解时区都有哪些:

1.GMT:Greenwich Mean Time

格林威治标准时间 ; 英国伦敦格林威治定为0°经线开始的地方,地球每15°经度 被分为一个时区,共分为24个时区,相邻时区相差一小时;例: 中国北京位于东八区,GMT时间比北京时间慢8小时。

2.UTC: Coordinated Universal Time

世界协调时间;经严谨计算得到的时间,精确到秒,误差在0.9s以内, 是比GMT更为精确的世界时间

3.DST: Daylight Saving Time

夏季节约时间,即夏令时;是为了利用夏天充足的光照而将时间调早一个小时,北美、欧洲的许多国家实行夏令时;

4.CST:四个不同时区的缩写:
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 古巴标准时间

分析

画出用户时间数据的流转过程,如图

存在时区的几个存储地点:客户端,服务器,JVM。Mysql

流程:用户的浏览器根据客户端时区,获取当前时间---》把时间参数传给服务器--》jvm根据设置选择服务器的当前时区或者自己设置的时区---》把时间存入mysql,mysql安装时有自己的时区

需求:需要时间在传入和取出来的时候,保证一致

解决办法那就需要保证不同时区之间可以来回转换或者时区都一致不进行转换

解决过程

1.客户端

这个是用户的电脑,我们不能要求用户使用什么时区,所以这个无法修改,用户可能使用各种时区这个是时间变化的原因,也是导致不统一的根本因素

2.服务器和JVM

服务器这里有两种方式

(1)JVM在服务器上,如果JVM没有设置时区的话,就会默认选择当前服务器的时区。

(2)设置JVM的时区,这样就会屏蔽掉服务器的时区,服务器的时区不会影响JVM的时区,也就不会影响用户时间参数的流转,选择这个

[原创]Java项目统一UTC时间方案

3.Mysql

查看时区show variables like '%time_zone%';

设置mysql的时区:MySQL默认的时区是UTC时区
    
(1)永久的修改:修改mysql的配置文件my-default.ini,添加:default-time-zone=’+08:00’,重启mysql生效,注意一定要在 [mysqld] 之下加 ,否则会出现 unknown variable ‘default-time-zone=+8:00’

my-default.ini文件内:
[mysqld] 
default-time-zone='+08:00'

(2)临时的修改:执行mysql命令 set global time_zone=’+08:00’,立即生效,重启mysql后失效

set time_zone = '+8:00';
set global time_zone='+08:00';

设置时区总结:客户端不设置,用户随意时区变化--》设置JVM的时区为UTC---》设置mysql的永久时区为UTC

代码解决过程

1.客户端选择本地时区的时间

2.前端组件判断转换为UTC时区的时间

3.前端传给后端的时候,后端使用@DateTimeFormat注解转换格式,但是这个不能处理时区

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date date;

4.后端JVM设置为

@SpringBootApplication
public class Application {
 @PostConstruct
 void started() {
      TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
 } 
  public static void main(String[] args) { 
  SpringApplication.run(Application.class, args); 
} 
}

5.代码连接数据库的url,其中useLegacyDatetimeCode参数默认是true,我们需要手动设置为false,否则无效

spring.datasource.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=UTC

6.mysql设置存储时区为UTC

7.从数据库到服务器,服务器后端(前面的过程不会乱变了,只需要)返回给前端的时候使用@JsonFormat,固定时区

@JsonFormat(
    pattern = "yyyy-MM-dd HH:mm:ss",
    timezone = "GMT+8"
)
private Date date;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/449333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动端适配方法:rem+vw

1.百分比设置:几乎不用 因为各种属性百分比参照物(自身/父元素/...需要去查文档)很难统计固定,所以不用百分比进行适配 2.rem单位动态html的font-size 使用rem,因为rem参考html的fz,只需要在不同的屏幕上设置不同的html的fz即可,其他地方全用rem rem的fz尺寸 媒体查询 编写…

推荐系统召回之userCF

基于用户的协同过滤算法userCF 1.1 相似度计算 通过计算用户之间的相似度。这里的相似度指的是两个用户的兴趣相似度。 假设对于用户u uu和v vv,N ( u ) N(u)N(u)指的是用户u uu喜欢的物品集合,N ( v ) N(v)N(v)指的是用户v vv喜欢的物品集合&#xff0…

体验 Kubernetes Cluster API

体验 Kubernetes Cluster API 什么是 Kubernetes Cluster API安装 Kind增加 ulimit 和 inotify创建 Kind 集群安装 clusterctl CLI 工具初始化管理集群创建一个工作负载集群访问工作负载集群部署一个 CNI 解决方案安装 MetalLB部署 nginx 示例清理(参考)capi-quickstart.yaml 文…

C++的类和对象(2)

类和对象 1.类对象模型1.1. 如何计算类对象的大小1.2. 类的存储模式讨论1.3. 类对象的空间符合结构体对齐规则 2. this指针2.1. this指针的引出2.2. this指针的特性2.3.面试题2.4. C语言和C实现栈的对比 1.类对象模型 1.1. 如何计算类对象的大小 class A { public: void Prin…

类加载与卸载

加载过程 其中验证,准备,解析合称链接 加载通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class对象. 验证确保Class文件符合当前虚拟机的要求,不会危害到虚拟机自身安全. 准备进行内存分配,为static修饰的类变量分配内存,并设置初始值(0或null).不包含final修饰…

用python脚本从Cadence导出xdc约束文件

用python脚本从Cadence导出xdc约束文件 概述转换方法先导出csv文件修改CSV文件 CSV转XDC检查输出XDC文件csv2xdc源代码下载 概述 在Cadence设计完成带有FPGA芯片的原理图的时候,往往需要将FPGA管脚和网络对应关系导入vivado设计软件中,对于大规模FPGA管…

springboot+vue准妈妈孕期交流平台(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的准妈妈孕期交流平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:…

C++引用篇

文章目录 一、引用概念及示例二、引用做函数参数二、引用做函数的返回值四、常引用五、引用和指针的区别 一、引用概念及示例 c语言指针存变量地址,然后通过解引用可以访问或者改变变量,且也可以改变指针变量里面存的地址 修改变量这样还需要对指针变量…

Faster RCNN系列3——RPN的真值详解与损失值计算

Faster RCNN系列: Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 目录 一、RPN真值详解二、…

手把手教你实现el-table实现跨表格禁用选项,以及禁用选择后,对应的全选按钮也要禁用任何操作

哈喽 大家好啊 今天我要实现不能跨表格选择,如果我选择了其中一个表格的选项后,那么其他的表格选项则被禁用 然后我选择了其中一个表格行,我其他的表格选项则应该被禁用 实现代码: 其中关键属性: selectable仅对 typ…

如何保障企业网络安全

随着信息技术的迅速发展,网络已经渗透到了我们生活的方方面面。企业对网络的依赖程度也越来越高,网络安全问题已经成为了企业面临的一个重要挑战。那么,在这个风险重重的网络世界里,我们如何充分利用现有技术保障企业网络安全呢&a…

智能指针——C++

智能指针相较于普通指针的区别&#xff0c;就是智能指针可以不用主动释放内存空间&#xff0c;系统会自动释放&#xff0c;避免了内存泄漏。 1、unique_ptr&#xff1a;独占指针 需包含的头文件&#xff1a;#include <memory> unique_ptr 三种定义方式 先定义一个类 …

learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)

目录 温故知新 理解"unsigned int a -10;" 如何理解大小端 大小端的概念 大小端是如何影响数据存储的 sigend char a -128的深度理解 10000000为什么是-128&#xff0c;而不是-0 代码练习 unsigned int类型的写法规范 温故知新 理解"unsigned int a…

python数据结构与算法-动态规划(最长公共子序列)

一、最长公共子序列问题 1、问题概念 一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如&#xff1a;"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y&#xff0c;求X和Y长度最大的公共子字列。 例:X"ABBCBDE”…

【ABAQUS Python二次开发】 debug : ini解析ERROR:没有实例属性‘__getintem__’

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; https://www.cnblogs.com/aksoam/p/17287136.html abaqus python 搭配ini…

古埃及:金字塔

文章目录 I 建造金字塔1.1 切割巨石1.2 开凿巨石1.3 摞石1.4 大金字塔的入口呈三角形 see also I 建造金字塔 在生活中&#xff0c;事实是正确的&#xff0c;如果理论解释不了现实&#xff0c;需要更正理论。 1.1 切割巨石 建筑材料巨石的切割&#xff1a;把石英砂粘在了铜锯…

记一次Macbook pro电池修复

记一次Macbook pro电池修复 mac版本 A1708 问题描述 Macbook更换新电池后&#xff0c;在项头栏中&#xff0c;没有显示电池图标&#xff0c;系统设置里面也找不到电池图标。这样开机还得连着电源线 ~ ^~ 原因分析&#xff1a; 有可能是电池排线坏了。 解决方案&#xff1a…

【C/C++】C++11 线程库重大历史意义

文章目录 C11 线程库重大意义【C11 中最重要的特性&#xff1a;就是对线程进行支持】API 比较C11 线程库APILinux/Win 系统线程库 API代码示例 Demo C11 线程库重大意义【C11 中最重要的特性&#xff1a;就是对线程进行支持】 C11 线程库解决了历史多线程跨平台问题&#xff0…

C++语法(20)---- 模拟红黑树

C语法&#xff08;19&#xff09;---- 模拟AVL树_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130229501?spm1001.2014.3001.5501 目录 1.红黑树介绍 2.模拟实现 1.枚举红黑颜色 2.节点的定义 3.树类框架 4.插入 5.检查 3.代码实现 1…

【开发经验】spring事件监听机制关心的同步、异步、事务问题

文章目录 spring发布订阅示例同步核心源码分析如何配置异步事务问题 观察者模式又称为发布订阅模式&#xff0c;定义为&#xff1a;对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖它的对象都得到通知并被自动更新。 如下图所示&…