Mysql 时区差8小时的多种问题 统统解决

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

背景

最近在开发【Java面试 | 笑小枫】小程序,便发现老是有人半夜偷偷刷题,如下图所示:

现在都这么卷了吗?大半夜的都不睡觉了吗?还在撸题~越想越不对,赶紧看了一下,发现自己录入题目的时间也好多都在凌晨。

好家伙,秒懂,时区错了。错就错了吧,影响也不大。

直到现在出现了每日签到的功能,好吧顺手改一下,反正也不难。都改了,顺手整理篇博客吧。

知识点

UTC:Coordinated Universal Time 协调世界时。

GMT:Greenwich Mean Time 格林尼治标准时间。(在协调世界时意义上的0时区,即GMT = UTC+0)

中国的时间是【东八区】,比GMT多八个小时,即 GMT+8(或UTC+8,但习惯上还是用GMT+8)

代码中常见的三种时间差错问题

【我遇到的】本地获取的时间没有错,存入数据库的时候时间相差8小时

mybatis将本地的数据传入到mysql数据库服务器的时候,服务器会对数据进行检测,会把date类型的数据自动转换为mysql服务器所对应的时区,即0时区,所以会相差8小时。

解决方案:

  • 在数据库链接上添加serverTimezone=GMT%2B8

Mysql 时区差8小时的多种问题 统统解决

java下使用 new date()获取的时间会和真实的本地时间相差8小时

new date()调用的是jvm时间,而jvm使用的时间默认是0时区的时间,即:和北京时间将会相差8小时。

解决方案:

  • 手动设置jvm时间:将时间改为第8时区的时间:
  • 如果是springboot项目,可以面向切面加上这个,或者启动main类上加上如下代码:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

数据库时间没有错,获取到了后端,之后返回给前端相差8小时

springboot中对加了@RestController或者@Controller+@ResponseBody注解的方法的返回值默认是Json格式,所以,对date类型的数据,在返回浏览器端时,会被springboot默认的Jackson框架转换,而Jackson框架默认的时区GMT(相对于中国是少了8小时)。所以最终返回到前端结果是相差8小时。

解决方案:

  • 将spring的json构造器的时区改正即可,在application.yml文件中添加:
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  • 可以使用注解,在entity实体类的date数据上添加注解,那么数据库传回的data数据要转换为json格式的时候就是北京时间了,再次传回到前端的时候,也不会出现时区问题。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date updateDate;

数据库代码时区的问题

以上说的都是代码中时间的问题,还有一种情况,就是sql使用NOW()获取时间,这种写法太可恶了。强烈不推荐

这种情况使用的是数据库的时间,首先我们看一下数据库时间

select NOW();

如果和当前时间一致,那么恭喜你,没问题。

如果比当前时间少8小时,那么依旧恭喜你,你穿越了。

Mysql 时区差8小时的多种问题 统统解决

言归正传,如果比当前时间少8小时,该怎么处理呢?

通过Sql命令修改,临时生效

本方法的优点是,生效快,不需要重启数据库;缺点是重启数据库后配置失效。

  1. 首先检查下Mysql系统时区
show variables like '%time_zone%';
  1. 设置时区
-- 修改mysql全局时区为北京时间,即我们所在的东8区
set global time_zone = '+08:00'; 

-- 修改当前会话时区,不然需要重新打开会话才会生效
set time_zone = '+08:00';
  1. 立即刷新生效
flush privileges;

然后再执行一下我们的select NOW();查看一下时间,OK,时间一致

通过配置文件来进行修改,永久性生效

本方法的优点是永久性生效,缺点是需要重启数据库

修改mysql的配置文件。linux系统上是my.cnf文件,window系统是my.ini

在[mysqld]区域中加上 default-time_zone = ‘+8:00’

重启mysql使新时区生效

总结

本文到这里就结束了。总结一下吧

  1. 代码中常见的数据问题是,程序中正常,保存到数据库中差8小时,这种情况用在数据库连接中添加serverTimezone=GMT%2B8
  2. Java下使用 new date()获取的时间会和真实的本地时间相差8小时,这个需要修改JVM时区,正常很少见
  3. 数据库时间没有错,获取到了后端,之后返回给前端相差8小时,可以通过设置json转换的时区来进行调整
  4. 修改数据库的时区,可以通过命令临时修改和通过配置文件永久性修改

Mysql 时区差8小时的多种问题 统统解决文章来源地址https://www.toymoban.com/news/detail-446478.html

到了这里,关于Mysql 时区差8小时的多种问题 统统解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot解决mysql 连接8小时问题

    问题: 服务连接mysql数据库,8小时没有数据库的操作时候,数据库会主动断开连接释放资源 解决办法总共 4种方法 如果你有权限访问 MySQL 服务器的配置,你也可以调整 MySQL 的连接超时时间。修改 wait_timeout 和 interactive_timeout 参数,将它们设置为一个更大的值,以延长连接的

    2024年02月12日
    浏览(20)
  • docker启动容器指定时区 解决mysql时间非北京时间问题

    运行docker镜像的时候可以指定环境变量TZ来设置使用那个时区的时间。如果不指定有些镜像在制作的时候设置了跟自己想用的时区不一样的时区就会出现尴尬的问题。 指定使用东八区时区命令如下: docker run -e TZ=Asia/Shanghai … docker启动mysql容器命令,指定库表编码:

    2024年02月14日
    浏览(35)
  • 实测解决 flink cdc mysql 时间字段差8小时/差13小时问题

    关键代码: 其中的:com.ysservice.utils.MySqlDateTimeConverter,根据自己的MySqlDateTimeConverter类路径进行修改 全量阶段和增量阶段的时间问题还不一样,实测本方式能全部解决,解决的同学记得回来点个赞!

    2024年02月16日
    浏览(31)
  • 永久解决MySQL时区问题:Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon

    前言连接MySQL的时候动不动就提示个Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon,一般就是MySQL时区没设置,接下来教大家3种解决方法。方法一:1.检查MySQL设置时区:Win+R打开运行输入cmd然后确定,打开cmd窗口连接数据库,输入mysql -hlocalhost -uroot mysql出现

    2024年02月16日
    浏览(32)
  • 时区的坑:数据时间在不同数据库中差8小时、13小时、14小时是怎么回事

    恭喜你,十有八九,就是时区的问题: 首先要明确的是,我们中国的标准时区是东八区,就是世界协调时间(UTC)加上八个小时,也就是UTC+8。 格林尼治标准时间 最坑的是美国时间,因为美国实行的是夏令时,也就是说美国是有两个时区在一天内来回切换,有几个月是西六区,

    2024年02月05日
    浏览(35)
  • Ubuntu、CentOS 修改时区、设置24小时时间格式

     修改设置时区  方法一 tzselect 方法二 仅限于RedHat Linux 和 CentOS系统 timeconfig 方法三 适用于Debian dpkg-reconfigure tzdata 方法四 复制相应的时区文件,替换CentOS系统时区文件;或者创建链接文件 cp /usr/share/zoneinfo/EST5EDT /etc/localtime 或者 ln -s /usr/share/zoneinfo/EST5EDT /etc/localtime 时间同步

    2024年02月05日
    浏览(36)
  • 全网多种方法解决com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure的问题

    今天在使用 knife4j ,调用后端接口时,报出如下错误: 于是,赶紧查看控制台的错误信息,错误信息如下所示:

    2024年02月06日
    浏览(96)
  • 彻底搞懂MySQL TimeStamp的时区问题

    mysql中有两个时间类型,timestamp与datetime,其中timestamp在存储上是包含时区的,而datetime是不包含时区的字符串形式。而通常应用下所说的时区问题,也指的是Java应用使用了jdbc驱动时,存储和读取的时区不一致的问题,两者可能会相差8小时或者13小时,今天,就来彻底搞懂为

    2024年02月03日
    浏览(36)
  • ubuntu 22.04修改时区 让date显示以24小时格式显示

    我原本想在我的服务器上做几个定时的监控任务(crontab 任务),但是在我测试我任务的时候总是不能按照系统时间进行执行(我通过date来看是02:30:45)我就把任务执行的时间写在他的下一分钟结果没有执行(其实如果不改显示格式通过data -R看时间也可以)。

    2024年02月13日
    浏览(47)
  • Golang通过Gorm操作Mysql时遇到的datetime时区问题

    golang使用Gorm操作MySQL,MySQL中数据类型是datetime,Golang中用的是time.now。 但是会导致存储的时间与北京时间有8h误差, 显然是没有初始化时区导致。 参考我自己之前写过的一篇总结——Mysql中多种日期类型——DATETIME、TIMESTAMP、TIME、YEAR、DATE的区分 datetime是给什么就存什么,

    2024年01月20日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包