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

随笔2个月前发布 天若有情
32 0 0

 编写了获取当前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实例有差距

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...