idea、服务器、数据库环境时区不一致问题

文章目录

前言

在开发过程中碰到了这样一个问题:同一条sql在本地和线上执行情况不一致,在时间字段上出现不同。

  • sql:

    xml 复制代码
    SELECT
      ID AS id,
      version_number AS versionNumber,
      release_date AS releaseDate
    FROM
      library_version
    WHERE is_valid = 't'
      <if test="libraryId != null">
        and library_id = #{libraryId}
      </if>
    ORDER BY
      (SELECT (regexp_matches(version_number, '^(\d+)'))[1]::int) DESC NULLS LAST
    limit #{pageSize} offset #{offset}

    其中release_date的类型为timestamptz

  • idea执行结果:

  • 数据库、服务器中执行结果:

    可以观察到releaseDate结果有所不同,idea将数据库中的时区默认转化为了东八区时间。而服务器上和数据库中均为UTC时区。

为什么会出现时区不一致的情况?

  • idea:连接数据库时设置了东八区,或者本地系统是东八区
  • 服务器:运行在UTC时区环境下
  • 数据库:可能存储的是UTC时间,不同客户端解释方式不同

也就是说三者时区不一致,导致线上和本地环境执行情况不同。

如何解决?

为了确保时区一致,我们可以检查以下配置是否完备:

  1. application配置:

    properties 复制代码
    # 记得替换ip、port、数据库为自己的
    spring.datasource.base.jdbc-url=jdbc:postgresql://xxx.xxx.xxx.xxx:5432/database?timezone=Asia/Shanghai
    # 在每个sql执行前增加语句,用于设置时区
    spring.datasource.hikari.connection-init-sql=SET TIME ZONE 'Asia/Shanghai'
  2. dockerfile
    确保部署的项目时区是东八区

    复制代码
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
  3. 服务器环境

    bash 复制代码
    # 检查服务器时区
    date
    timedatectl status
    # 设置服务器时区(Linux)
    sudo timedatectl set-timezone Asia/Shanghai

总结

  1. 检查代码中,数据库连接中是否设置好时区
  2. 检查dockerfile中是否设置了时区
  3. 检查服务器时区

以上为个人学习分享,如有问题,欢迎指出:)

相关推荐
2501_914245933 分钟前
构建 Go CLI 应用的最佳实践:纯 Go 交互式命令行库选型与使用指南
jvm·数据库·python
m0_514520575 分钟前
Go语言变量如何声明和使用_Go语言变量定义完整教程【通俗】
jvm·数据库·python
xuanwenchao11 分钟前
ROS2学习笔记 - 2、类的继承及使用
服务器·笔记·学习
weixin_5860614617 分钟前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
秋920 分钟前
数据库对比同步工具,快速比较开发库与生产库直接的差别,并自动生成存在差异的sql语句
数据库·oracle
Greyson137 分钟前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸.txt
jvm·数据库·python
Whitemeen太白37 分钟前
查询子级分类、父级分类、叶子节点分类(MySQL / Oracle )
数据库·mysql·oracle
C#程序员一枚37 分钟前
高可用(High Availability, HA)
数据库·c#
孙同学_1 小时前
【项目篇】高并发服务器 - HTTP服务器组件拆解,从Util到HttpServer
运维·服务器·http
2401_883600251 小时前
Redis如何查询特定用户的排名_利用ZREVRANK指令获取ZSet降序名次
jvm·数据库·python