Go 模板中的 時間 格式化
1. 概念
如果有人問你說現在幾點? 你看了看錶回答他說晚上8點了. 這樣回答看上去沒有什麼問題,但是如果問你的這個人在歐洲的話那麼你的回答就會讓他很疑惑,因為他那裡還太陽當空呢.
這裡就有產生了一個如何定義時間的問題. 因為在地球環繞太陽旋轉的24個小時中,世界各地日出日落的時間是不一樣的.所以我們才有劃分時區(timezone) 的必要,也就是把全球劃分成24個不同的時區. 所以我們可以把時間的定義理解為一個時間的值加上所在地的時區(注意這個所在地可以精確到城市)
地理課上我們都學過格林威治時間(GMT), 它也就是0時區時間. 但是我們在計算機中經常看到的是UTC. 它是Coordinated Universal Time的簡寫. 雖然可以認為UTC和GMT的值相等(誤差相當之小),但是UTC已經被認定為是國際標準,所以我們都應該遵守標準只使用UTC
那麼假如現在中國當地的時間是晚上8點的話,我們可以有下面兩種表示方式
20:00 CST 12:00 UTC
這裡的CST是Chinese Standard Time,也就是我們通常所說的北京時間了. 因為中國處在UTC+8時區,依次類推那麼也就是12:00 UTC了.
為什麼要說這些呢?
第一,不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出UTC+0的時間值而不會提供時區(因為它不知道你在哪裡).所以當我們設定系統時間的時候,設定好時區是首先要做的工作
第二,很多國家都有夏令時(我記得小時候中國也實行過一次),那就是在一年當中的某一天時鐘撥快一小時(比如從UTC+8一下變成UTC+9了),那麼同理到時候還要再撥慢回來.如果我們設定了正確的時區,當需要改變時間的時候系統就會自動替我們調整。
2. 例子
Golang的模版注入,可以向模版中注入資料,並最終生成注入後的結果。但對於時間資料因為注入的是標準時間UTC,因此時間的顯示過程就存在根據時區做本地化的顯示轉換.
例如
注入資料:
type Post struct { Idint Titlestring CreatedOn time.Time //時間 }
模版
<span>{{ .CreatedOn }}</span> <span>{{ .CreatedOn.Format "2006 Jan 02" }}</span> <span>{{ .CreatedOn.Format "Jan 02, 2006" }}</span> <span>{{.CreatedOn.Format "Jan 02, 2006 15:04:05 UTC" }}</span>
那麼輸出是
2015-04-04 20:51:48 2015 Apr 04 Apr 04, 2015 Apr 04, 2015 20:51:48 UTC
相同的時間戳展示出不同的時間,是通過Format 中的字串選定時域完成的。
golang 中可選的時間域集合可以參考標準庫的format.go檔案
const ( ANSIC= "Mon Jan _2 15:04:05 2006" UnixDate= "Mon Jan _2 15:04:05 MST 2006" RubyDate= "Mon Jan 02 15:04:05 -0700 2006" RFC822= "02 Jan 06 15:04 MST" RFC822Z= "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850= "Monday, 02-Jan-06 15:04:05 MST" RFC1123= "Mon, 02 Jan 2006 15:04:05 MST" RFC1123Z= "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone RFC3339= "2006-01-02T15:04:05Z07:00" RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" Kitchen= "3:04PM" // Handy time stamps. Stamp= "Jan _2 15:04:05" StampMilli = "Jan _2 15:04:05.000" StampMicro = "Jan _2 15:04:05.000000" StampNano= "Jan _2 15:04:05.000000000" )