关于go-zero时区问题会出现在2处
1、在rpc的项目中etc中的yaml,sql的链接字符串会指定一个时区
2、在部署服务时go的time.local会读取服务器时区(k8s pod可重新指定镜像时区)

1、认识时区

首先我们了解一下标准时区
GMT与UTC概念:https://blog.csdn.net/qq_43713303/article/details/106764589
在这里插入图片描述

2、RPC项目中的yaml

在yaml字符串中配置如下

Datasource: 数据库连接/数据库名?parseTime=true&charset=utf8&loc=Asia%2fShanghai

在最后有2个后缀我们需要了解一下

parseTime=true
loc=Asia%2fShanghai

这个说明我们从mysql(注意:这里仅限mysql场景下)取出的时间字符串(datetime类型,存储的值为:2022-07-28 11:07:20)会拼接上定义的loc,最后输出的字符串为 2022-07-28 11:07:20 +0800 UTC

为什么会拼接 +0800 UTC ?
因为我们制定了loc的时区为Asia/shanghai,仅此!

3、将含有时区的字符串转为时间戳

方式一:
传入参数 timeStr为:2022-07-28 11:07:20 +0800 UTC 字符串
使用如下的方式进行转化
最后的time.Local为获取服务器时间(或pod指定时间)

	expire, err := time.ParseInLocation("2006-01-02 15:04:05 -0700 MST", timeStr, time.Local)

这里 2006-01-02 15:04:05 -0700 MST其实都是格式化的占位符
类似yyyy-MM-dd hh:mm:ss + -0700 MST 这样的站位方式
解释一下-0700 MST:就是世界0时区

方式二:
传入参数 timeStr为:2022-07-28 11:07:20字符串
使用如下的方式进行转化

	expire, err := time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐