springboot web项目统一时区方案

news/2024/5/19 19:03:02/

背景

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 {@PostConstructvoid 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.ppmy.cn/news/48256.html

相关文章

Kubernetes Operator开发

案例一 Traefik Operator开发 1.kubebuilder 创建项目 2.Crontroller开发与部署 开发环境准备 kubebuilder 介绍 CRD的开发与部署 Crontroller开发与部署 Operator功能设计 借助operator完成 和企业内部注册中心打通 这里以Traefiketcd的模式为例进行演示说明 在这里etcd p…

1.2和1.3、GCC

1.2和1.3、GCC 1.2和1.3、GCC1.2.1、什么是GCC1.2.2、编程语言的发展1.2.3、GCC工作流程1.2.4、gcc和g的区别1.2.5、GCC常用参数选项实际操作①接下来进行预处理操作(test.c为需要预处理的源代码,test.i为要生成的目标代码)②汇编操作&#x…

多线程基础

1.多线程基础概念 多线程:让程序同时做多件事情 多线程作用:提高效率 并发:在同一时间,有多个指令在单个cpu上交替执行 并行:在同一时刻,有多个指令在多个cpu上同时执行 2.多线程的实现 (1)继承Thread类…

电脑卡顿反应慢怎么处理?电脑提速,4个方法!

案例:电脑卡顿反应慢怎么处理? 【快帮帮我!我的电脑现在越用越卡了,有时候光是打开一个文件都要卡好几分钟,我真的太难了,有什么可以加速电脑反应速度的好方法吗?万分感谢!】 随着…

es7.x集群部署-多台物理机部署-docker环境部署-docker-compose管理

es集群部署文档 部署es服务的三台服务器的ip和host分分别是: iphost_name192.168.1.2web02192.168.1.3storage02192.168.1.4Storage03 这个配置需要在服务器上编写对应的hosts文件,然后才可以使用host进行配置。 本次部署没有外挂配置文件&#xff0…

手把手教你 DVOL

分享本文在朋友圈的读者可获得本文数据和 Python 代码。留个言说已分享(不用截屏)我相信你,我会发给你百度盘下载链接。 本文长度为 6393 字,建议阅读 32 分钟 题图:SignalPlus Dashboard 0 引言 Deribit volatility (…

Qt音视频开发37-识别鼠标按下像素坐标

一、前言 在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询等;…

记录webpack安装

在安装完 yarn以后,yarn安装_阿巴资源站的博客-CSDN博客 然后开始安装webpack 看网上有人说npm install webpack-cli -g没成功,于是没试直接跳过坑 sudo npm install webpack -g --unsafe-permtrue --allow-root 然后提示: webpack -v On…

RabbitMQ:消息中间件

文章目录 概念管理界面简介4中常见交换器类型1.Direct交换器:2.Fanout交换器3.Topic交换器4.headers交换器 对象类型消息传递同步等待使用代码创建队列待续...... 概念 在微服务架构中项目之间项目A调用项目B 项目B调用项目C项目C调用项目D。。 用户必须等待项目之间内容依次的…

【闲聊杂谈】HTTPS原理详解

HTTPS和HTTP的区别 HTTP虽然使用极为广泛, 但是却存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付, 网络交易等新兴应用中安全方面最需要关注的。 关于 HTTP的明文数据传输, 攻击者最常用的攻击手法就是网络嗅探, 试图从传输过程…

亚马逊广告运营常见问答

同一个广告组中,建议投放多少个关键词呢? 同一广告组下我们建议投放的关键词至多不超过50个。 1.如关键词设置过少(且前期无法用数据佐证其精准引流效果时),有可能导致广告曝光量较低; 2.如关键词设置过多…

SAS学习第9章:卡方检验之适合性检验与独立性检验

卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时&#xf…

查询练习:按等级查询

建立一个 grade 表代表学生的成绩等级,并插入数据: CREATE TABLE grade (low INT(3),upp INT(3),grade char(1) );INSERT INTO grade VALUES (90, 100, A); INSERT INTO grade VALUES (80, 89, B); INSERT INTO grade VALUES (70, 79, C); INSERT INTO …

U-Boot 命令使用

进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所 支持的命令,如图 所示: 我们输入“help(或?) 命令名”既可以查看命令的详细用法,以“bootz”这 个命令为例,我们输…

使用FFMPEG库将YUV编码为H264

准备 ffmpeg 4.4 p准备一段yuv420p的格式的视频原始数据 这里我们使用命令直接提取 ffmpeg -i .\beautlWorld.mp4 -pixel_format yuv420p -s 1280x720 yuv420p_1280x720.yuv 编码流程 大致可以分为以下几步: 1.初始化编码器并设置参数 2.初始化AVPacket和AVFr…

适应大、中、小型医院的手术麻醉临床信息管理系统源码

手术麻醉管理系统是一款专门用于医院手术麻醉管理的软件系统,它可以帮助医院和医生更好地管理手术麻醉过程,提高手术麻醉的质量和安全性。本文将介绍手术麻醉管理系统的实现、功能概述、主要功能、系统设置、麻醉管理、术中记录、苏醒室记录、PCA实施及管…

gRPC(Java) keepAlive机制研究

文章目录 结论Client端KeepAlive使用入口简要时序列表 Server端KeepAlive使用入口简要时序列表KeepAliveEnforcer 基于java gRPC 1.24.2 分析 结论 gRPC keepAlive是grpc框架在应用层面连接保活的一种措施。即当grpc连接上没有业务数据时,是否发送pingpong,以保持连…

快手社招Java后端开发岗面试,被问麻了

社招面试是基于你的工作项目来展开问的,比如你项目用了 xxx 技术,那么面试就会追问你项目是怎么用 xxx 技术的,遇到什么难点和挑战,然后再考察一下这个 xxx 技术的原理。 今天就分享一位快手社招面经,岗位是后端开发&…

陪诊小程序开发|陪诊软件开发功能特色

为了提升就医的服务质量,人们对于医疗服务的需求也在不断提高。这几年随着生活水平和医疗水平的提升,陪诊服务越来越受到人们的重视和青睐,越来越多的人开始意识到,陪伴和关爱在疾病治疗过程中的重要性,为了更好的规划…

第四章 面向对象(OOP)

目录 一、编程思想 1.1. 面向对象 1.2. 面向过程 1.3.举例说明(把大象装进冰箱) 1.4.二者的联系与区别 1.5.面向对象的三个阶段 1.6.什么是类,什么是实例,二者的联系 二、面向对象三大特征 2.1 封装 2.2 继承 2.3 多态…