本文主要介绍Docker、Go、PostgreSQL如何修改它们的时区。
首先需要知道一些基础概念:
- Unix 时间戳 -是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
- UTC –协调世界时,又称世界统一时间、世界标准时间、国际协调时间。
- CST–可视为中国、古巴的标准时间或美国、澳大利亚的中部时间。北京时间,也就是东八区时间。
Docker
Docker 作为部署和运行应用程序的环境,默认使用 UTC 作为其容器的时区,但我们可以通过设置环境变量来修改时区。
修改的方法
- 在 Dockerfile 中添加以下行:
ENV TZ=Asia/Shanghai
- 在 Kubernetes 中的 Pod 配置文件中,添加 env 字段,设置环境变量。Example:
spec:
containers:
- name: my-container
image: my-image
env:
- name: TZ
value: Asia/Shanghai
- 验证在容器中使用 env 命令查看环境变量,例如
env
输出会有key为TZ,value为Asia/Shanghai表示成功
TZ=Asia/Shanghai
Go
在 Go 中修改时区需要使用标准库中的 time 包。我们可以通过FixedZone来修改时区。 Example:
package main
import (
"fmt"
"time"
)
func main() {
var utcZone = time.FixedZone("UTC", 0*3600) // UTC
time.Local = utcZone
utcNow := time.Now()
utcDate := time.Date(utcNow.Year(), utcNow.Month(), utcNow.Day(), 0, 0, 0, 0, utcNow.Location())
fmt.Printf("UTC time: %s\n", utcDate.String())
fmt.Printf("UTC timestamp: %d\n", utcDate.Unix())
var cstZone = time.FixedZone("CST", 8*3600) // 东八
time.Local = cstZone
cstNow := time.Now()
cstDate := time.Date(cstNow.Year(), cstNow.Month(), cstNow.Day(), 0, 0, 0, 0, cstNow.Location())
fmt.Printf("CST time: %s\n", cstDate.String())
fmt.Printf("CST timestamp: %d\n", cstDate.Unix())
}
//output
//UTC time: 2023-02-25 00:00:00 +0000 UTC
//UTC timestamp: 1677283200
//CST time: 2023-02-25 00:00:00 +0800 CST
//CST timestamp: 1677254400
在上面的代码中,我们使用time.FixedZone分别设置UTC、上海时区,并获取当天零点的时间戳 _date。
PostgreSQL
在PostgreSQL系统内部,所有日期和时间都用全球统一时间UTC格式存储, 时间在发给客户前端前由数据库服务器根据TimeZone 配置参数声明的时区转换成本地时间。
在 PostgreSQL 中,我们可以通过修改 postgresql.conf 文件来修改时区。 以下是如何在 Docker运行 PostgreSQL 中修改时区的步骤:
- 拷贝dockers中的 postgresql.conf到宿主主机
sudo docker cp [your_docker_contariner_id]:/var/lib/postgresql/data/postgresql.conf /[your_work_space]/
- 修改配置
sudo vi /[your_work_space]/postgresql.conf
查找替换timezone为上海时区
timezone = 'Asia/Shanghai'
可以通过sql查找支持的时区:
select * from pg_timezone_names;
- 保存并覆盖dockers中配置
sudo docker cp /[your_work_space]/postgresql.conf [your_docker_contariner_id]:/var/lib/postgresql/data/
- 重新容器
sudo docker restart [your_docker_contariner_id
现在,你的 PostgreSQL 数据库就使用了正确的时区。
- 检查是否设置成功 通过sql获取设置:
select * from pg_db_role_setting;
也可以查看数据库中表字段格式为TimestampTZ,Example 修改前
2023-02-25 00:00:00 +0000 +00
修改后台
2023-02-25 08:00:00 +0000 +08
以上。