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)

 

你可能感兴趣的:(Go)