首页 > 数据库 >Java,MySQL,JDBC,Jackson时区问题

Java,MySQL,JDBC,Jackson时区问题

时间:2024-04-09 09:03:02浏览次数:32  
标签:UTC JDBC Java 数据库 MySQL Jackson 时区 GMT

Java,MySQL,JDBC,Jackson时区问题

今天做了一个测试,主要是测试给时区参数设置不同的值,会出现什么样的问题。

  • 数据库是UTC时区。JDBC连接是GMT+8。jackson默认是UTC。JVM时区GMT+8。
    • 从数据库中查询的时间是正确的的,jackson会将时间缩短8个小时。
  • 数据库是UTC时区。JDBC连接是GMT+8。jackson是GMT+8。JVM时区GMT+8。
    • 从数据库中查询的时间是正确的的,jackson时间也是正确的。
  • 数据库是UTC时区。JDBC连接是UTC。jackson默认是UTC。JVM时区GMT+8。
    • 从数据库查询到的时间,如果是Date对象,时间会相差8个小时,在经过jackson的UTC序列化,与数据库时间一致。LocalDateTime不影响。
  • 数据库是UTC时区。JDBC连接是UTC。jackson默认是GMT+8。JVM时区GMT+8。
    • 从数据库查询到的时间,如果是Date对象,时间会相差8个小时。jackson的GMT+8序列化之后时间没有变化,与查询出来的时间一致。

得到的结论

在经过实际测试,再结合数据GPT的解答中,我理解时区问题应该是这样

  • JDBC中参数时区
    • 首先是GPT的回答
      JDBC中的GMT+8是指告诉Java程序在处理日期和时间数据时,应该将数据库中的日期时间值转换为GMT+8时区。
      在Java程序与数据库进行交互时,日期和时间数据需要进行转换以确保正确处理。数据库服务器可能位于不同的时区,而Java程序通常运行在客户端所在的时区。
      因此,当Java程序从数据库中检索日期时间数据时,需要将这些数据转换为客户端所在的时区,以便正确显示和处理。同样地,当Java程序向数据库插入或更新日期时间数据时,也需要将数据转换为数据库服务器所在的时区。
      在JDBC中,可以通过在数据库连接字符串中指定时区参数来告诉Java程序使用GMT+8时区。例如,在MySQL数据库中,可以在连接字符串中添加serverTimezone=GMT%2B8参数来指定使用GMT+8时区。
      这样做可以确保Java程序在处理日期时间数据时,能够正确地将数据库中的值转换为客户端所在的时区,从而避免时区差异带来的问题。
      总之,JDBC中的GMT+8是用来告诉Java程序在处理日期时间数据时使用GMT+8时区,以确保正确地与数据库进行交互。
    • 我的理解
      • JDBC中的时区参数是设置给Java程序看的。告诉Java我用的是哪一个时区,你准备好根据我给你的时区做好转换工作。
      • 如果JVM时区是GMT+8,JDBC设置的时区是UTC。那么JDBC查询数据库得到时间字段之后,Java会认为你JDBC给我的日期时区是UTC的,我需要转换成我本地的GMT+8。这就会导致Java中接收到的时间字段与数据库时间字段真实的值不相同的问题。
      • 如果JVM时区是GMT+8,JDBC设置的时区是GMT+8。那么JDBC查询数据库得到时间字段之后,Java会认为你JDBC给我的日期时区是GMT+8的,我本地恰好也是GMT+8的时区,所以不会进行转换。
      • 对于插入数据,如果JVM时区是GMT+8,JDBC设置的时区是UTC。那么会将GMT+8转换成UTC时间,保存到数据库。
  • MySQL中的时区
    经过测试发现,当MySQL时区与对应的JDBC时区不同的时候,以JDBC设置的时区参数为准。如果MYSQL时区与Java时区不一致,在SQL中运行now()函数的时候,会获取到MySQL所在时区的时间。

标签:UTC,JDBC,Java,数据库,MySQL,Jackson,时区,GMT
From: https://www.cnblogs.com/zhaoleiFree/p/18123031

相关文章

  • 遵循这些MySQL设计规范,再也没被组长喷过
    分享是最有效的学习方式。博客:https://blog.ktdaddy.com/故事会议室里,小猫挠着头,心里暗暗叫苦着“哎,这代码都撸完了呀,改起来成本也太大了。”原来就在刚才,组长找到了小猫,说代码review过程中发现有些数据表模型设计得不合理,要求小猫改掉。小猫大概是设计了一个配置表,为了省事......
  • JDBC的使用与封装
    昨天学习了JDBC,连接数据库的操作,今天对JDBC做一个整合理解 JDBC的简述:JDBC是Java用来操作数据库的工具,实际就是不同的数据库实现了Java的接口,我们可以理解为:Java规范了接口,数据库实现了接口作用:通过Java代码操作数据库这里就是简述一下JDBC,如果大家如果想看的更详细,可以去......
  • 【附源码】JAVA计算机毕业设计校园技术交流与信息分享系统(源码+mysql+文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在信息技术迅猛发展的当今时代,校园作为知识传播和技术创新的重要场所,急需一个高效的技术交流与信息分享系统来促进学术资源的整合和优化。随着互联网技......
  • 【附源码】JAVA计算机毕业设计校园二手交易(源码+mysql+文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着科技的不断进步和智能手机的普及,移动应用已成为人们生活不可或缺的一部分。特别是在校园内,学生们对于便捷的服务需求日益增长。在这样的背景下,校园......
  • 校园台球厅人员与设备管理系统的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......
  • CTFHUB-技能树-Web前置技能-SQL注入-Mysql结构-UA注入
    技能树-Web前置技能-SQL注入-Mysql结构-UA注入文章目录技能树-Web前置技能-SQL注入-Mysql结构-UA注入UA注入手工注入判断注入点判断字段数判断回显字段数爆库名爆表名爆列名sqlmap爆库爆表爆列名爆数据UA注入UA注入,即User-Agent注入手工注入利用bp抓包,发送......
  • mysql 随机日期
     以下是两种不同的实现方法来生成一个随机日期:方法一:使用MySQL内置的日期函数SELECTDATE_ADD('1970-01-01',INTERVALFLOOR(RAND()*DATEDIFF('2100-01-01','1970-01-01'))DAY);使用RAND()函数生成一个0到1之间的随机数,将其与从1970年1月1日到2100年1月1日之间的天数相......
  • Mysql 报 java.sql.SQLException:null,message from server:“Host ‘‘ is not allow
    这个错误i是因为mysql数据库没有放开远程访问权限引起的,以mysql8为例首先进入Mysql安装目录,然后输入命令:mysql-uroot-p;具体参见下图:再输入usemysql;回车执行,接着输入,showtables;回车执行输入,selecthostfromuser;回车执行,这里特别说明一下,我这个是已经放......
  • linux环境安装——mysql安装复习
    B站地址:https://www.bilibili.com/video/BV1qS4y1h77S/?spm_id_from=333.337.search-card.all.click&vd_source=79bbd5b76bfd74c2ef1501653cee29d6    下面这个文件和mysql有冲突,需要优先查找并删除:   阿里云系统:cenos7 64位数; 安装包:mysql-8.0.30-linux-g......
  • MySQL分组查询实例
    DDL——学生表,课程表CREATETABLE`student`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`createDate`datetimeDEFAULTNULL,`userName`varchar(20)DEFAULTNULL,`pwd`varchar(36)DEFAULTNULL,`phone`varchar(11)DEFAULTNULL,`age`......