go 学习笔记:time

Posted on 2021-02-18 00:35  王石头py  阅读(60)  评论(0)    收藏  举报

time包

时间对象 time.Now()

func main() {
	now := time.Now() 		//获取当前时间
	fmt.Printf("current time:%v\n", now)	//current time:2021-02-17 18:38:33.448969 +0800 CST m=+0.000073901

	year := now.Year()     //年
	month := now.Month()   //月
	day := now.Day()       //日
	hour := now.Hour()     //小时
	minute := now.Minute() //分钟
	second := now.Second() //秒
	fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)	//2021-02-17 18:38:33
}

时间戳 time.Now().Unix()

  • 1970-1-1 到现在的秒数
func main() {
	now := time.Now()            //获取当前时间
	timestamp := now.Unix()     //时间戳
	timestamp2 := now.UnixNano() //纳秒时间戳
	fmt.Printf("current timestamp1:%v\n", timestamp)		//current timestamp1:1613558670
	fmt.Printf("current timestamp2:%v\n", timestamp2)	//current timestamp2:1613558539059848000

	timeObj := time.Unix(timestamp, 0) //将时间戳转为时间格式
	fmt.Println(timeObj)					//2021-02-17 18:44:30 +0800 CST
	year := timeObj.Year()     //年
	month := timeObj.Month()   //月
	day := timeObj.Day()       //日
	hour := timeObj.Hour()     //小时
	minute := timeObj.Minute() //分钟
	second := timeObj.Second() //秒
	fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)//2021-02-17 18:44:30
}

time.sleep() 和 time.Duration()

时间单位

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
	//time.Duration()
	var n int = 5
  //不能int乘以 Duration,必须通过time.Duration将int转换为Duration
	time.Sleep(time.Duration(n) * time.Second)

时间操作

Add

求当前时间/某个时间 的1小时之后的时间,Go语言的时间对象有提供Add方法如下:

func (t Time) Add(d Duration) Time

举个例子,求一个小时之后的时间:

func main() {
	now_time := time.Now()                           //获取当前时间
	fmt.Println(now_time)							//2021-02-17 19:01:51.311598 +0800 CST m=+0.000068790
	t2_time := now_time.Add(time.Hour)				//当前时间的1小时之后的时间
	fmt.Println(t2_time)							//2021-02-17 20:01:51.311598 +0800 CST m=+0.000068790
}

Sub

求 两个时间 之间 的间隔

func main() {
	now_time := time.Now()                           //获取当前时间
	t2_time := now_time.Add(time.Hour)				//当前时间的1小时之后的时间
	fmt.Println(t2_time.Sub(now_time))				//1h0m0s
}

返回一个时间段t-u。如果结果超出了Duration可以表示的最大值/最小值,将返回最大值/最小值。要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

Equal

func (t Time) Equal(u Time) bool

判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。本方法和用t==u不同,这种方法还会比较地点和时区信息。

Before

func (t Time) Before(u Time) bool

如果t代表的时间点在u之前,返回真;否则返回假。

After

func (t Time) After(u Time) bool

如果t代表的时间点在u之后,返回真;否则返回假。

定时器 time.Tick()

func main() {
	for tmp := range time.Tick(time.Second*2){	//定时器,每x秒触发1次
		fmt.Println(tmp)	//每x秒输出类似 2021-02-17 19:09:06.280391 +0800 CST m=+0.000084442
	}
}

时间格式化 time.Now().Format()

go中类比 y m d H:M:S 用的是2006 01 02 03 04 05 如果要24小时制,03 换成 15 即可

func main() {
	now_time := time.Now()                           //获取当前时间
	fmt.Println(now_time)

	//2006 01 02 之间用 - 用 空格 用 : 都根据自己喜好添加
	ret1 := now_time.Format("2006-01-02 03:04:05")	//2021-02-17 19:19:09
  ret2 := now_time.Format("2006-01-02 15:04:05 PM")	//2021-02-17 19:19:09 PM
  //带毫秒的
  ret3 := now_time.Format("2006-01-02 03:04:05.000 PM")	//2021-02-17 07:43:46.659 PM
	fmt.Println(ret1)
  fmt.Println(ret2)
  fmt.Println(ret3)
}

解析字符串类型的时间

  • 如果字符串是 "2021-01-01 15:00:00"- 的格式,解析模板也要用"2006-01-02 15:04:05"
  • 如果字符串是24小时制,解析模板也要用24小时制 "2006-01-02 15:04:05"
  • go解析的时间默认是 UTC 时间,如果要解析成东八区时间 需要单独指定时区,用 time.ParseInLocation()
func main() {
	//解析字符串格式的时间
	timeStr := "2021-01-01 15:00:00"
  
	//1,拿到时区
	loc,err := time.LoadLocation("Asia/Shanghai")
	if err != nil{	//如果报错
		fmt.Println(err)
		return
	}
  
	//2,解析字符串格式的时间,参数1:传解析出来的时间格式模板,参数2:传字符串格式的时间
	timeObj,err := time.Parse("2006-01-02 15:04:05",timeStr)
	if err != nil{
		fmt.Println("解析时间格式出错1:",err)
		return
	}
	fmt.Println(timeObj)				//2021-01-01 15:00:00 +0000 UTC
  
	//3,根据时区解析成指定某个时区的时间
	timeObj2,err2 := time.ParseInLocation("2006-01-02 15:04:05",timeStr,loc)
	if err != nil{
		fmt.Println("解析时间格式出错2:",err2)
		return
	}
	fmt.Println(timeObj2)				//2021-01-01 15:00:00 +0800 CST
}