许多新手开发人员在处理时区时感到困惑。

  • 如何将它们存储在数据库中
  • 如何在Go中解析它们

当将时区存储在数据库中时,请始终遵循一个标准时区,理想的做法是保存UTC时间,并在显示时区时根据需要将其转化为各种时区。

以MYSQL作为存储时间的示例

以下解决方案与DB无关。根据MySQL文档,有两种可以在MySQL存储时间的方法。

'1000-01-01 00:00:00''9999-12-31 23:59:59'TIMESTAMP'1970-01-01 00:00:01''2038-01-19 03:14:07'。

在本文中,我将使用DATETIME为例。

现在,另一个也是最重要的事情是读取并将其转化为其他时区。

Go时间时区的转换

下面的代码是展示我们如何在Go语言中做时区的转换. 首先让我们来定义地区和时区的的字典. 时区列表IANA时区标识可以从这里得到Time Zones,

Go语言time.LoadLocation可能的坑

正如标准库文档中所说的:

The time zone database needed by LoadLocation may not be present on all systems, especially non-Unix systems. LoadLocation looks in the directory or uncompressed zip file named by the ZONEINFO environment variable, if any, then looks in known installation locations on Unix systems, and finally looks in $GOROOT/lib/time/zoneinfo.zip.

ZONEINFO$GOROOT/lib/time/ ZONEINFO .zip
Docker Go语言使用时区

默认的情况下时区信息文件时在Go安装的时候已经存在. 但是万一你部署和编译docker使用的时 multi-stage-docker Alpine 镜像.你可以手动的使用一下命令来添加时区的数据.

RUN apk add tzdata
/usr/share/timezoneZONEINFO/usr/share/timezone
ZONEINFO=/usr/share/timezone

这里有一个参考的示例 Dockerfile

您可以在Go playground https://play.golang.org/p/UCKSpIWmiX7中查看完整示例