“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)