当前位置: 首页 > article >正文

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

这个问题可能与服务器的时区设置有关。通常在服务器中,如果时区设置与前端应用使用的时区不一致,会导致时间显示错误,例如时差 8 小时问题,需要检查数据库的时区格式,服务器的时区,以及后台代码返回的格式数据。

1. 检查和设置服务器的时区

查看当前服务器时区

timedatectl

你会看到类似以下的输出:

Local time: Sun 2024-12-31 14:00:00 CST
Universal time: Sun 2024-12-31 06:00:00 UTC
RTC time: Sun 2024-12-31 06:00:00
Time zone: Asia/Shanghai (CST, +0800)

如果时区不是 Asia/Shanghai,可能是问题的原因。

设置时区为中国时区
sudo timedatectl set-timezone Asia/Shanghai
同步时间
sudo apt update
sudo apt install -y ntpdate
sudo ntpdate time.windows.com

再次确认时区设置是否正确:

timedatectl

2. 检查和调整 MySQL 的时区设置

如果你的后端使用了 MySQL 数据库,且时间字段在后端处理,可以检查 MySQL 的时区设置:

1、检查 MySQL 的时区 登录 MySQL,执行以下命令:

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)中,添加以下内容:

[mysqld]
default-time-zone = '+08:00'

然后重启 MySQL 服务:
sudo systemctl restart mysql

3、检查后端数据源配置

查看你数据库的url

jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true

用若依的框架,这里我这边就没进行修改,serverTimezone为GMT 英国时间。
修改为:

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 中:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "Asia/Shanghai")
private Date createTime;

5、Docker 容器中的时区设置

如果你的项目是跑在容器内的。非常建议你先检查你的项目在容器内的时区,(我的问题就出现在这)容器没有挂载到宿主机的问题。
1、进入docker 容器

docker exec -it <镜像名字> bash
  1. 查看容器内时间
    进入容器后,运行以下命令查看时间:
date
  1. 退出容器
    查看完时间后,可以输入 exit 退出容器。
    我的问题出现在这里,输出是以下格式内容。
root@e8ccd15a4ba4:/# date
Tue Dec 31 00:52:53 UTC 2024
解决办法:

方法 1: 在运行时挂载宿主机时区文件
1.1如果容器内时区不正确,可以在启动容器时挂载宿主机的时区文件

docker run -d --name ruoyi \
  -p 8085:8085 \
  -v /etc/localtime:/etc/localtime:ro \
  -v /etc/timezone:/etc/timezone:ro \
  myImage:1.0

1.2这样容器会自动使用宿主机的时区。
方法 2: 手动修改容器时区
2.1进入容器:

docker exec -it myImage bash

2.2安装 tzdata 并设置时区:

apt-get update && apt-get install -y tzdata
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

2.3验证时间是否正确:
date

解决!!!!!


http://www.kler.cn/a/460721.html

相关文章:

  • 使用Docker部署最新版JupyterHub
  • C#二维数组详解
  • gitlab 还原合并请求
  • SQL-leetcode-197. 上升的温度
  • 【Python】FastAPI之SQLAlchemy、关联关系
  • 《机器学习》——线性回归模型
  • C#语言的软件工程
  • 2024年工作总结
  • 2024年6月英语六级CET6写作与翻译笔记
  • UE5 把场景转成HDR图
  • 018-spring-基于aop的事务控制
  • 陕西图纸文档加密软件是如何对图纸进行防泄密保护的呢?
  • 图片叠加拖拽对比展示效果实现——Vue版
  • 高斯核函数(深入浅出)
  • Java 21 优雅和安全地处理 null
  • 短视频矩阵系统贴牌流程全解析
  • java锁
  • FFmpeg 编码和解码
  • 《Java编程入门官方教程》第十六章练习答案
  • 【Spring MVC 核心概念】揭秘概念和整体架构
  • 图表控件Aspose.Diagram入门教程(7):在 C# 中删除 Visio 形状保护
  • OpenStack系列第三篇:CentOS7 上部署 OpenStack(Train版)集群教程 Ⅳ Dashboard Cinder 服务部署
  • 低代码/无代码开发平台下的电商API接口创新应用
  • Microsoft 365 Copilot模型多元化,降低对OpenAI依赖并降低成本
  • gitlab 还原合并请求
  • JVM调优(内存、GC、JVM参数)