[Go 08] 認識時間格式與golang的時區轉換寫法
開發過程中,曾遇過部署到別的平台,時間就變成+0 時區了(例如明明下午五點,部署平台顯示早上九點),這時才發現原來你的時間不是他的時間,而資料庫中也常常用時間戳數字來做紀錄,但顯示給使用者時又要轉成格式化顯示,本篇紀錄各種時間格式的理解與 go 程式對於時間的使用
理解時間的各種顯示格式
時間可以以很多格式化的方式做顯示。例如最常看到的 2021-04-22 17:27:44
標準時間格式
國際標準格式,像是 ISO_8601
- 合併表示時,要在時間前面加一大寫字母 T
- 如果時間在零時區,並恰好與協調世界時相同,那麼(不加空格)在時間最後加一個大寫字母 Z
例如以下這樣的顯示方式:
1 | 2021-04-28T01:51:35Z |
UNIX 時間與時間戳
UNIX 時間代表從 UTC1970 年 1 月 1 日 0 時 0 分 0 秒起至現在的總秒數
- 而 UTC 為世界協調時間(英語:Coordinated Universal Time,法語:Temps Universel Coordonné,簡稱 UTC)是最主要的世界時間標準。
- 這種你會看到可能是十位數的數字(s:1621999487)或是十三位數的數字(ms:1621999487377),可以透過線上時間戳轉換器得出代表的時間。
時區的轉換
世界各國位於地球不同位置上,,不同地區的人會有不同的地方時間,可以看時區轉換器
golang 時間轉換
接著說明使用 golang 實現以上幾種常見的轉換,而 2006-01-02 15:04:05-0700 是一串 go 獨特神奇的對應順序。可以看time/format.go
大致列出四種轉換:
將時間戳轉換為時間
將時間做格式化輸出,golang 語法的時間輸出跟 java 比較不一樣。2006-01-02 15:04:05-0700 對應到 yyyy-MM-dd HH:mm:ss Z,請見golang 與 java time 的對照表,
記憶順序有點像是06代表年,後面則是1,2,3,4,5,7
時區轉換: FixedZone(name,位移的秒數),可以自訂時區命名信息,loc := time.FixedZone(“UTC-8”, -8 _ 60 _ 60)第二個參數轉移多少秒,可以改+8 時區等等
時區轉換: LoadLocation(name),可以輸入空值,”UTC”,”Local”,或是時區的資料庫 EX: “Asia/Taipei”,命名使用的資料庫為IANA Time Zone database,好處是不用自己輸入到底是+ 8 還加多久,知道時區命名就好,但是背後的定義還是會依下列順序去找尋對應資料:
- ZONEINFO 環境變數所指定的 zip 文件
- Unix 系统中已经安装的
- $GOROOT/lib/time/zoneinfo.zip,
因此如果在 windows 系统上,没有安装 go 語言環境,time.LoadLocation 會失敗,建議用 time.FixedZone。
另外在 docker 環境裡也要注意使用的 image 是否已經有包含這些資料,否則會出現 unknown time zone XXXX 的錯誤,解決方法需要加入以下設定
1 | FROM alpine |
四種轉換時間格式範例程式:
1 | package main |
轉換結果:
1 | timestamp: 1619083664867 |
網路參考文章
[Go 08] 認識時間格式與golang的時區轉換寫法