docker Java mysql,返回的时间差 8 小时

132 天前
 zzlyzq

各位大佬,俺们开发过程中遇到一个问题,涉及到 docker java mysql ,其中在分享物联网设备的过程中,时间差了 8 个小时,保存到 mysql 的时间是 utc 时间,java 获取的也是 utc 时间,而 java 返回给用户的时间会通过调用 mysql 过程中自动设置在 utc8 时间。

为啥会差 8 小时呢,请大佬指导。

1372 次点击
所在节点    Docker
10 条回复
ZeawinL
132 天前
时区。
建议用服务器时间,而不是 now()之类的函数。
cJ8SxGOWRH0LSelC
132 天前
在程序启动的时候设置一下属性。

// 设置默认时区为 UTC+8 (东八区)
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
dengshen
132 天前
1 楼正解! 把本机的时区配置文件带进去容器
XiLingHost
132 天前
所有时间都用 uint64 来存,只存 timestamp ,在展示时再附加时区信息转换为人类可读时间
zzlyzq
132 天前
@dengshen 有道理。但是用的华为的 CCE ,非自建 k8s 集群,没法挂时区文件了。倒是,Dockerfile 中已经做了上海的时区文件。
julyclyde
131 天前
@zzlyzq 我猜你这个时区文件做的不对

我记得,应该是 localtime 符号连接指向 Asia/Shanghai 是正确做法吧
zzlyzq
131 天前
经测试,与 jdk 容器环境有关系,测试了几个主要的版本 8u111 8u412 没有问题,8u342 有问题,可以通过增加-Duser.timezone=Asia/Shanghai 解决。
yuanmomo
130 天前
@XiLingHost ve 这个才是正确的做法。
julyclyde
130 天前
now 函数没带时区属性吗?
zzlyzq
130 天前
@yuanmomo 是的,目前存到数据库中的也是 utc 时间,只是程序依赖容器/系统获取的 时区配置,而 8u342 这个版本不发像 8u111 和 8u412 一样可以正常获取,所以需要再 java 运行过程中指定 选项。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1064366

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX