本文主要介绍Docker、Go、PostgreSQL如何修改它们的时区。

首先需要知道一些基础概念:

  1. Unix 时间戳 -是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
  2. UTC –协调世界时,又称世界统一时间、世界标准时间、国际协调时间。
  3. CST–可视为中国、古巴的标准时间或美国、澳大利亚的中部时间。北京时间,也就是东八区时间。

Docker

Docker 作为部署和运行应用程序的环境,默认使用 UTC 作为其容器的时区,但我们可以通过设置环境变量来修改时区。

修改的方法

  1. 在 Dockerfile 中添加以下行:
ENV TZ=Asia/Shanghai
  1. 在 Kubernetes 中的 Pod 配置文件中,添加 env 字段,设置环境变量。Example:
spec:
  containers:
  - name: my-container
    image: my-image
    env:
      - name: TZ
        value: Asia/Shanghai
  1. 验证在容器中使用 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 中修改时区的步骤:

  1. 拷贝dockers中的 postgresql.conf到宿主主机
sudo docker cp [your_docker_contariner_id]:/var/lib/postgresql/data/postgresql.conf /[your_work_space]/
  1. 修改配置
sudo vi /[your_work_space]/postgresql.conf

查找替换timezone为上海时区

timezone = 'Asia/Shanghai'

可以通过sql查找支持的时区:

select * from pg_timezone_names;
  1. 保存并覆盖dockers中配置
sudo docker cp /[your_work_space]/postgresql.conf [your_docker_contariner_id]:/var/lib/postgresql/data/
  1. 重新容器
sudo docker restart [your_docker_contariner_id

现在,你的 PostgreSQL 数据库就使用了正确的时区。

  1. 检查是否设置成功 通过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

以上。

参考