go中的time包及時間格式化問題

“2006-01-02 15:04:05,這個時間據說是紀念go語言的誕生時間。”今天又聽到了這句話,爲什麼很多人這麼說,可能一個人說了被其他人聽到,然後一傳十十傳百的傳開了(三人成虎吧)。具體是不是爲了紀念,那應該只有設計go語言的肯湯普森和羅勃派克知道了。那爲什麼是這個格式呢?估計很多人沒整明白,特別是初學go,如果沒弄明白,就要死記這個時間格式了。那這個時間格式化到底是怎麼個意思呢?下面就來探討下。

請注意這個時間格式:

2006-01-02 15:04:05  或者  2006/01/02 15:04:05

可以用代碼試一下這個時間格式化形式

package main

import (
	"fmt"
	"time"
)

func main(){
	now := time.Now()
	fmt.Println(now.Format("2006-01-02 15:04:05"))
}

其結果格式應該是這樣的

>>> 2020-06-28 20:30:00

那麼,這是固定格式嗎?再把時間格式化形式換成 “2006-01-02 03:04:05” ,其結果

>>> 2020-06-28 08:30:42

看出區別了嗎?沒錯第一次輸出爲24小時制,第二次爲12小時制。爲什麼呢?03[12小時制] + 12小時 = 15[24小時制]

還可以再改嗎?我們試試 “2006-1-2 03:04:05” ,結果爲

>>> 2020-6-28 08:31:26

再改, “2006-1-2 3:4:5”

>>> 2020-6-28 8:31:26

因爲time.Now()執行時當前時間,觀察不太方便。再執行如下代碼

t :=time.Date(2020, time.April,5, 6, 7, 8, 23, time.Local)
fmt.Println(t.Format("2006-1-2 3:4:5"))

>>> 結果  2020-4-5 6:7:8

由此,可以看出時間格式化規律了,也就是12345嘛,那就只需要記住2006就行了。得出總結:

【注:以下單數表示在10以下數字不補0】

2006 年(固定)
01 雙數月(如 06)
1 單數月(如 6)
02 雙數日(如 03)
2 單數日 (如 3)
03 12小時制
15 24小時制
04 雙數分
4 單數分
05  雙數秒
5 單數秒

 時間戳和時間的互轉

package main

import (
	. "fmt"
	"time"
)

//time.Now()  // 當前時間
//time.Now().Unix()  // 當前時間戳
//time.Now().UnixNano()  // 當前納秒時間戳

func main() {
	// 將時間戳轉爲時間
	timestamp := time.Now().Unix()
	resTime := time.Unix(timestamp, 0)  // 第一個參數爲Unix秒時間,第二個參數爲UnixNano納秒時間
	Println(resTime)
	t := resTime.Format("2006-01-02 15:04:05")
	Println(t)

	// 將時間轉爲時間戳
	timeLocal, _ := time.ParseInLocation("2006-01-02 15:04:05", t, time.Local)
	Println(timeLocal)
	Println(timeLocal.Unix())
}

注:time.Parse()中其格式化稍嚴格。

// Parse時間格式化年月日必須嚴格對應,雙數則格式化雙數,單數則格式化單數
// "2020年06月07日"格式化時必須爲 "2006年01月02日",且年月日漢字也一樣
// 一雙一單格式化可爲 雙單 或 嚴格對應。"2020年6月07日" 格式化可爲"2006年1月2日"
// 時分秒格式化 
// "8:9:5" 只能爲 "3:4:5"
// "08:09:05" 可以任意格式化
// 時使用0補雙數,格式化時必須爲03或15,分秒爲單數,格式化必須爲單數
s := "2020年6月7日 8:9:5"
t2 ,err := time.Parse("2006年1月2日 3:4:5",s)  
if err != nil{
	fmt.Println("err:",err)
}
fmt.Println(t2)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章