V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zzlyzq
V2EX  ›  Docker

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

  •  
  •   zzlyzq · 83 天前 · 1310 次点击
    这是一个创建于 83 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    10 条回复    2024-08-14 15:21:30 +08:00
    ZeawinL
        1
    ZeawinL  
       83 天前 via iPhone
    时区。
    建议用服务器时间,而不是 now()之类的函数。
    StinkyTofus
        2
    StinkyTofus  
       83 天前
    在程序启动的时候设置一下属性。

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

    我记得,应该是 localtime 符号连接指向 Asia/Shanghai 是正确做法吧
    zzlyzq
        7
    zzlyzq  
    OP
       82 天前   ❤️ 1
    经测试,与 jdk 容器环境有关系,测试了几个主要的版本 8u111 8u412 没有问题,8u342 有问题,可以通过增加-Duser.timezone=Asia/Shanghai 解决。
    yuanmomo
        8
    yuanmomo  
       82 天前 via iPhone
    @XiLingHost ve 这个才是正确的做法。
    julyclyde
        9
    julyclyde  
       81 天前
    now 函数没带时区属性吗?
    zzlyzq
        10
    zzlyzq  
    OP
       81 天前
    @yuanmomo 是的,目前存到数据库中的也是 utc 时间,只是程序依赖容器/系统获取的 时区配置,而 8u342 这个版本不发像 8u111 和 8u412 一样可以正常获取,所以需要再 java 运行过程中指定 选项。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2823 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 12:57 · PVG 20:57 · LAX 04:57 · JFK 07:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.