七叶笔记 » golang编程 » go中的time包及时间格式化问题

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)  

相关文章