go 序列化反序列化之后时区信息丢失

  •  编写了获取当前datetime 时间的方法如下
    // GetCurrentDateString 获取当天的时间date
    func GetCurrentDateString() time.Time {
        // 获取当前时间
        currentTime := time.Now().Local()
        // 格式化日期为字符串
        dateString := currentTime.Format(time.DateTime)
        resultTime, _ := time.Parse(time.DateTime, dateString)
        return resultTime
    }

    插入db之后发现时间+8了。

  • 造成以上原因是因为反序列化之后时区信息丢失了。所以没有时区的时候time到db用的是国际时间。所以跟北京/上海时间大致会相差8h
  • 解决方案 反序列化的时候代码改成 : 
    // GetCurrentDateString 获取当天的时间date
    func GetCurrentDateString() time.Time {
        // 获取当前时间
        currentTime := time.Now().Local()
        // 格式化日期为字符串
        dateString := currentTime.Format(time.DateTime)
        resultTime, _ := time.ParseInLocation(time.DateTime, dateString, time.Local)
        return resultTime
    }

     

  • 如果时间字符串中带了时区信息才去使用 time.Parse,否则使用 time.ParseInLocation
  • 排查db 和本地时间对不上的思路方案:
    • 检查链接字符串是否添加时区信息  例如 : parseTime=true&loc=Local
    • 检查服务器当前时区 是否正确: timedatectl | grep "Time zone"
    • 检查mysql 时区设置:SHOW VARIABLES LIKE '%time_zone%';
    • 阿里云AnalyticDB实例Datatime 类型最多精确到秒。使用TIMESTAMP可以存储'2024-03-11 15:22:11.4688249' 。 使用起来和Mysql实例有差距
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章