springboot web项目统一时区方案

这篇具有很好参考价值的文章主要介绍了springboot web项目统一时区方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

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 古巴标准时间

分析

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

springboot web项目统一时区方案

存在时区的几个存储地点:客户端,服务器,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,固定时区文章来源地址https://www.toymoban.com/news/detail-425889.html

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

到了这里,关于springboot web项目统一时区方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统

    国际化、全球化集团,业务遍布全世界,下属公司众多,集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公,深化企业统一管理。 面对大型集团全球化的管理诉求,数字化办公系统作为集团日常使用的平台,自然需要适应企业管理

    2024年02月07日
    浏览(33)
  • SpringBoot使用外部Web容器的解决方案

    Spring Boot 默认内嵌了Web容器(如Tomcat、Jetty或Undertow),这使得应用可以作为独立的可执行JAR或WAR文件运行,无需外部Web容器。然而,在某些情况下,你可能想要将Spring Boot应用部署到外部的Web容器中,比如Apache Tomcat或Jetty。 嵌入式的Web容器:应用可以打包成可执行的Jar。 优

    2024年03月09日
    浏览(26)
  • 基于elk的springboot web日志收集存储方案

    web系统的日志按照价值排序分类 controller层的接口访问日志(debug日志) 自定义包下的其他日志(debug日志) 全局日志 ① 全局错误日志 ② 部分组件的debug日志 ③ 部分组件的Info日志 一般来讲,1和2的价值最大,2可基于实际业务情况,进一步划分,如component目录下日志,ser

    2024年02月09日
    浏览(21)
  • 基于JAVA大学生创新创业项目管理系统设计与实现(Springboot框架) 研究背景与意义、国内外研究现状

     博主介绍 :黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、

    2024年02月03日
    浏览(38)
  • Linux部署web项目/springboot项目(详细步骤)

    小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步,欢迎关注! 目录 一、安装jdk 1:问题 1.1Openj

    2024年02月03日
    浏览(28)
  • 基于 Docker 部署 Mysql 的时区设置解决方案

    环境版本及条件: 基于 Docker 部署的 Mysql:8.0.27 版本数据库中。 datatime 数据类型的字段设置了默认时间戳 CURRENT_TIME。 SpringBoot + MP。 问题复现: 使用MP插入数据时,该字段的默认时间戳比 Asia/Shanghai 时区少了 8 小时。 问题追因 排查过程: 查看 Mysql 时区配置属性。 查看 Doc

    2024年02月11日
    浏览(38)
  • Java SimpleDateFormat设置时区导致时间不正确的解决方案

    问题介绍 在Android开发中经常遇到有的接口需要上传当前时间,如果后台要求直接传一个long类型的时间戳还好,因为这个时间戳是跟时区无关的,如果后台接口要求传的是格式化的时间,若本地设备设置的时区与后台要就的时区不一致,就会导致上传的时间不准确。 不完善的

    2024年02月11日
    浏览(32)
  • SpringBoot项目配置多个RabbitMQ解决方案

    目前有一个Spring Boot项目,已经接入一个RabbitMQ Broker,由于业务扩展,需要新增一个RabbitMQ Broker进行消费,由于单个Broker时通过Spring默认配置进行使用,因此需要做出修改 pom 增加properties配置 增加配置类 增加properties配置 修改配置类

    2024年02月11日
    浏览(31)
  • 芋道SpringBoot配置Maven、创建SpringBoot项目、创建Web接口、读取配置信息

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 第一章 芋道 Spring Boot 快速入门 芋道 SpringBoot是一款国产的SpringCloud微服务框架,包括Outh2.0、微服务网关、微服务注册中

    2024年04月23日
    浏览(26)
  • Flutter Web 项目网络请求报 XMLHttpRequest error 解决方案

    使用http库进行简单的网络请求时,运行在Chrome浏览器上,网络请求一直报错 XMLHttpRequest error,而在iOS 模拟器上运行则正常,后面在postman上发送请求,也是正常的。这就是很尴尬了!!! 经多番查阅,是跨域问题,解决方案如下: 1.找到flutter sdk目录 2.然后找到flutterpackage

    2024年02月11日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包