V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sunshinev
V2EX  ›  问与答

golang xorm 时区问题?请大神指点

  •  
  •   sunshinev · 2021-01-12 16:32:39 +08:00 · 974 次点击
    这是一个创建于 1192 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 xom 的 created 自动写入创建时间,发现数据库里面的时间 晚了 8 小时

    // 这是数据库里面的记录
    2021-01-12 08:14:08 
    
    // 这是应该正常的时间
    2021-01-12 16:14:08 
    

    然后在服务器上,打印时间相关的信息,发现也都是正常的

    log.Printf("time now is %v", time.Now().Format(config.DateTimeLayout))
    // 2021-01-12 16:14:08
    
    log.Printf("time e is %+v %+v", *e.TZLocation, *e.DatabaseTZ)
    // local 信息比较多,但是显示 name:Local
    
    log.Printf("time is %+v", time.Now().Location())
    // local
    

    查看数据库的时区是 CST,也是中国时区

    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | system_time_zone | CST    |
    | time_zone        | SYSTEM |
    +------------------+--------+
    

    服务器上 shell,打印出来的时间也是正常的

    $ date -R
    Tue, 12 Jan 2021 16:31:34 +0800
    

    这么看,好像都是没有问题的,但是就是写入数据库之后,变成了-8 小时

    3 条回复    2022-02-25 20:42:05 +08:00
    sunshinev
        1
    sunshinev  
    OP
       2021-01-12 16:55:23 +08:00
    ![8ce5ba258afa45a0cefeeb289ae334dc1610441572.jpg]( https://cdn.jsdelivr.net/gh/sunshinev/remote_pics/8ce5ba258afa45a0cefeeb289ae334dc1610441572.jpg)

    按照官网的文档说 loc 默认是 UTC 的,那出现这种情况,就只能是
    1. 服务器按照 CST 的格式给到 sql 库进行处理
    2. sql 库 把传过来的值按照本地的 timezone CST 转换成 loc 的默认 UTC 来处理 就 -8 个小时
    3. sql 库把记录写入到数据库,就变成了 服务器也是 CST,数据库也是 CST,但是莫名其妙 减去了 8 个小时
    hugo2lee
        2
    hugo2lee  
       2021-01-12 17:22:04 +08:00
    数据库链接有没有加 loc=Local
    lunny
        3
    lunny  
       2022-02-25 20:42:05 +08:00
    `engine.DatabseTZ =`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1926 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:20 · PVG 00:20 · LAX 09:20 · JFK 12:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.