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