踩坑之服务器时间和本地时间相差8小时

打印 上一主题 下一主题

主题 1719|帖子 1719|积分 5157

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个问题可能与服务器的时区设置有关。通常在服务器中,假如时区设置与前端应用使用的时区不一致,会导致时间表现错误,比方时差 8 小时问题,需要查抄数据库的时区格式,服务器的时区,以及后台代码返回的格式数据。
1. 查抄和设置服务器的时区

查看当前服务器时区
  1. timedate
  2. ctl
复制代码
你会看到类似以下的输出:
  1. Local time: Sun 2024-12-31 14:00:00 CST
  2. Universal time: Sun 2024-12-31 06:00:00 UTC
  3. RTC time: Sun 2024-12-31 06:00:00
  4. Time zone: Asia/Shanghai (CST, +0800)
复制代码
假如时区不是 Asia/Shanghai,可能是问题的原因。
设置时区为中国时区

  1. sudo timedate
  2. ctl
  3. set-timezone Asia/Shanghai
复制代码
同步时间

  1. sudo apt update
  2. sudo apt install -y ntpdate
  3. sudo ntpdate
  4. time.windows.com
复制代码
再次确认时区设置是否精确:
  1. timedate
  2. ctl
复制代码
2. 查抄和调整 MySQL 的时区设置

假如你的后端使用了 MySQL 数据库,且时间字段在后端处理,可以查抄 MySQL 的时区设置:
1、查抄 MySQL 的时区 登录 MySQL,实验以下命令:
  1. SELECT @@global.time_zone, @@session.time_zone
复制代码
2、假如返回的是 SYSTEM 或 UTC,可能需要调整为 Asia/Shanghai。
修改 MySQL 的时区 在 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf)中,添加以下内容:
  1. [mysqld]
  2. default-time-zone = '+08:00'
复制代码
然后重启 MySQL 服务:
sudo systemctl restart mysql
3、查抄后端数据源配置

查看你数据库的url
  1. jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
复制代码
用若依的框架,这里我这边就没进行修改,serverTimezone为GMT 英国时间。
修改为:
  1. url: jdbc:mysql://localhost:3306/test?useUnicode=yes&characterEncoding=UTF-8&useSSL=true&serverTimezone=Asia/Shanghai
复制代码
将serverTimezone 调治成Asia/Shanghai
4、API 数据传输过程中偶然间差异

假如后端返回的时间在日志或调试中表现精确,但传递到前端后出现错误,可能是序列化/反序列化时忽略了时区。
解决方法:


  • 查抄 API 返回的 JSON 数据,确保时间字段包含时区信息。
  • 假如时间字段缺失时区信息,可以在序列化时增补。比方,在 Spring Boot 中:
  1. @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "Asia/Shanghai")
  2. private Date createTime;
复制代码
5、Docker 容器中的时区设置

假如你的项目是跑在容器内的。非常发起你先查抄你的项目在容器内的时区,(我的问题就出现在这)容器没有挂载到宿主机的问题。
1、进入docker 容器
  1. docker exec -it <镜像名字> bash
复制代码

  • 查看容器内时间
    进入容器后,运行以下命令查看时间:
  1. date
复制代码

  • 退出容器
    查看完时间后,可以输入 exit 退出容器。
    我的问题出现在这里,输出是以下格式内容。
  1. root@e8ccd15a4ba4:/# date
  2. Tue Dec 31 00:52:53 UTC 2024
复制代码
解决办法:

方法 1: 在运行时挂载宿主机时区文件
1.1假如容器内时区不精确,可以在启动容器时挂载宿主机的时区文件
  1. docker run -d --name ruoyi \
  2.   -p 8085:8085 \
  3.   -v /etc/localtime:/etc/localtime:ro \
  4.   -v /etc/timezone:/etc/timezone:ro \
  5.   myImage:1.0
复制代码
1.2如许容器会主动使用宿主机的时区。
方法 2: 手动修改容器时区
2.1进入容器:
  1. docker exec -it myImage bash
复制代码
2.2安装 tzdata 并设置时区:
  1. apt-get update
  2. && apt-get install -y tzdataln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeecho "Asia/Shanghai" > /etc/timezone
复制代码
2.3验证时间是否精确:
date

解决!!!!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表