您好,登錄后才能下訂單哦!
這篇文章給大家介紹golang中怎么格式化時(shí)間和時(shí)區(qū),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
時(shí)區(qū)
時(shí)區(qū)是時(shí)間運(yùn)算非常重要的概念,特別強(qiáng)調(diào)與layout是兩個(gè)完全不同的概念。go語(yǔ)言通過(guò)Location來(lái)作為時(shí)區(qū)的運(yùn)行實(shí)例,同一時(shí)刻轉(zhuǎn)換成為不同的時(shí)區(qū),就需要通過(guò)不同的Location來(lái)進(jìn)行。默認(rèn)情況下,采用UTC(unix標(biāo)準(zhǔn)時(shí)間),而不是過(guò)去式的GMT(格林尼治標(biāo)準(zhǔn)時(shí)間)。
以下代碼展示了UTC標(biāo)準(zhǔn)、北京、美國(guó)洛杉磯在同一時(shí)刻的轉(zhuǎn)換:
now := time.Now() local1, err1 := time.LoadLocation("") //等同于"UTC" if err1 != nil { fmt.Println(err1) } local2, err2 := time.LoadLocation("Local")//服務(wù)器設(shè)置的時(shí)區(qū) if err2 != nil { fmt.Println(err2) } local3, err3 := time.LoadLocation("America/Los_Angeles") if err3 != nil { fmt.Println(err3) } fmt.Println(now.In(local1)) fmt.Println(now.In(local2)) fmt.Println(now.In(local3)) //output: //2016-12-04 07:39:06.270473069 +0000 UTC //2016-12-04 15:39:06.270473069 +0800 CST //2016-12-03 23:39:06.270473069 -0800 PST
代碼中,LoadLocation的輸入?yún)?shù)的取值,除了該函數(shù)的源代碼中可看到的”UTC”、”Local”,其余的值其實(shí)是遵照“IANA Time Zone”的規(guī)則,可以解壓$GOROOT/lib/time/zoneinfo.zip 這個(gè)文件打開(kāi)查看。在Asia這個(gè)目錄,我看到了Chongqing,Hong_Kong,但沒(méi)Beijing。在國(guó)外獲取中國(guó)北京時(shí)間,要用”P(pán)RC”,當(dāng)然”Asia/Chongqing”也是個(gè)方法:
loc, _:= time.LoadLocation("Asia/Chongqing") //參數(shù)就是解壓文件的“目錄”+“/”+“文件名”。 fmt.Println(time.Now().In(loc))
值得強(qiáng)調(diào)的是,Location僅用于時(shí)區(qū)轉(zhuǎn)化,而不對(duì)time內(nèi)部的數(shù)據(jù)產(chǎn)生影響(內(nèi)部其實(shí)是unix標(biāo)準(zhǔn)時(shí)),因此,當(dāng)幾個(gè)time實(shí)例進(jìn)行Add、Sub的時(shí)候,不用關(guān)注Location是否相同。
時(shí)間格式化
前面例子中,打印結(jié)果非常丑陋,通常沒(méi)人關(guān)心秒之后的ns;明確時(shí)區(qū)后,很少需要與UTC的時(shí)差。這時(shí)候,就需要定義我們的layout了。
網(wǎng)上好多都說(shuō),“2006-01-02 15:04:05是go的誕生時(shí)間,所以這么設(shè)計(jì)Format的Layout”,應(yīng)該不是真的。請(qǐng)看下表:
01/Jan | 02 | 03/15 | 04 | 05 | 06 | -07[00][:00] | PM | Mon |
---|---|---|---|---|---|---|---|---|
月 | 日 | 時(shí) | 分 | 秒 | 年 | 時(shí)差 | 上下午 | 星期幾 |
也就是1234567,分別對(duì)應(yīng):月日時(shí)分秒年 時(shí)差,很好記憶。只是稍微注意一下:
月:01或Jan都可以
小時(shí):03表示12小時(shí)制,15表示24小時(shí)制。
時(shí)差:是 -07 ,不是 07,后邊可以增加“00”或“:00”,表示更進(jìn)一步的分秒時(shí)差。
上下午:使用PM,不是AM。
擺放順序:隨意,甚至重復(fù)都可以。源代碼包也有定義的常用格式供使用。
也許是因?yàn)?6對(duì)應(yīng)的“年”與go的項(xiàng)目啟動(dòng)時(shí)間差不多,也就有了網(wǎng)上的誤傳。在源代碼time/time.go中,有非常明確的描述,粘貼一下,就不翻譯了:
// These are predefined layouts for use in Time.Format and Time.Parse.
// The reference time used in the layouts is the specific time:
// Mon Jan 2 15:04:05 MST 2006
// which is Unix time 1136239445. Since MST is GMT-0700,
// the reference time can be thought of as
// 01/02 03:04:05PM ‘06 -0700
雖然go已經(jīng)提供了10多個(gè)常用格式:
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" )
但個(gè)人習(xí)慣還是“2006-01-02 15:04:05 Mon”,之前代碼稍加修改,就是這樣:
formate:="2006-01-02 15:04:05 Mon" now := time.Now() local1, err1 := time.LoadLocation("UTC") //輸入?yún)?shù)"UTC",等同于"" if err1 != nil { fmt.Println(err1) } local2, err2 := time.LoadLocation("Local") if err2 != nil { fmt.Println(err2) } local3, err3 := time.LoadLocation("America/Los_Angeles") if err3 != nil { fmt.Println(err3) } fmt.Println(now.In(local1).Format(formate)) fmt.Println(now.In(local2).Format(formate)) fmt.Println(now.In(local3).Format(formate)) //output: //2016-12-04 08:06:39 Sun //2016-12-04 16:06:39 Sun //2016-12-04 00:06:39 Sun
時(shí)間初始化
除了最常用的time.Now,go還提供了通過(guò)unix標(biāo)準(zhǔn)時(shí)間、字符串兩種方式來(lái)初始化:
//通過(guò)字符串,默認(rèn)UTC時(shí)區(qū)初始化Time func Parse(layout, value string) (Time, error) //通過(guò)字符串,指定時(shí)區(qū)來(lái)初始化Time func ParseInLocation(layout, value string, loc *Location) (Time, error) //通過(guò)unix 標(biāo)準(zhǔn)時(shí)間初始化Time func Unix(sec int64, nsec int64) Time
時(shí)間初始化的時(shí)候,一定要注意原始輸入值的時(shí)區(qū)。正好手里有一個(gè)變量,洛杉磯當(dāng)?shù)貢r(shí)間“2016-11-28 19:36:25”,unix時(shí)間精確到秒為1480390585。將其解析出來(lái)的代碼如下:
local, _ := time.LoadLocation("America/Los_Angeles") timeFormat := "2006-01-02 15:04:05" //func Unix(sec int64, nsec int64) Time { time1 := time.Unix(1480390585, 0) //通過(guò)unix標(biāo)準(zhǔn)時(shí)間的秒,納秒設(shè)置時(shí)間 time2, _ := time.ParseInLocation(timeFormat, "2016-11-28 19:36:25", local) //洛杉磯時(shí)間 fmt.Println(time1.In(local).Format(timeFormat)) fmt.Println(time2.In(local).Format(timeFormat)) chinaLocal, _ := time.LoadLocation("Local")//運(yùn)行時(shí),該服務(wù)器必須設(shè)置為中國(guó)時(shí)區(qū),否則最好是采用"Asia/Chongqing"之類具體的參數(shù)。 fmt.Println(time2.In(chinaLocal).Format(timeFormat)) //output: //2016-11-28 19:36:25 //2016-11-28 19:36:25 //2016-11-29 11:36:25
當(dāng)然,如果輸入值是字符串,且?guī)в袝r(shí)區(qū)
“2016-12-04 15:39:06 +0800 CST”
關(guān)于golang中怎么格式化時(shí)間和時(shí)區(qū)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。