Jochen的golang小抄-进阶篇-time包

小抄系列进阶篇涉及的概念较多,知识点重要,故每块知识点独立成篇,方便日后笔记的查询

web开发经常需要展示时间,转换时间,对于时间的使用是非常频繁的。为此对于go语言中的时间操作这个技能树务必给它加满技能点!

本篇的主题是:time包

time包

时间单位换算:

1年 = 365天
1天 = 24小时
1小时 = 60分钟
1分钟 = 60秒
1秒 = 1000毫秒
1毫秒 = 1000微秒
1微秒 = 1000纳秒
1纳秒 = 1000皮秒

time包常用操作汇总如下:

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	//1.获取当前时间 time.Now()
	t1 := time.Now()
	//时间类型就是一个结构体类型
	fmt.Printf("%T\n", t1) //time.Time
	fmt.Println(t1)        //2021-02-16 03:54:37.561962676 +0800 CST m=+0.000074931

	//2.获取指定的时间 time.Date()
	//参数依次为:年,月,日,时,分,秒,纳秒,时区
	t2 := time.Date(2021, 2, 14, 5, 20, 0, 0, time.Local) //本地时区
	fmt.Printf("%T\n", t2)                                //time.Time
	fmt.Println(t2)                                       //2021-02-14 05:20:00 +0800 CST

	/*
		3.将时间类型格式化为字符串输出(常用于返回给前端做展示)t.Format(“格式模板”)
			需要提供格式模板,模板的日期必须是固定的这个时间点: 2006-1-2 15:04:05
		(可以任意的时间格式,但必须是这个时间点,据说是为了纪念go的诞生时间)
	*/
	//格式化前
	fmt.Println(t1) //2021-02-16 03:54:37.561962676 +0800 CST m=+0.000074931
	ts := t1.Format("2006年1月2日 15:04:05")
	//格式化后
	fmt.Println(ts) //2021年2月16日 03:54:37
	//只获取年日
	fmt.Println(t1.Format("2006-01-02")) //2021-02-16
	//输出的格式就是根据你的模板格式来的,只不过模板的时间点是固定的

	/*
		4.将字符串类型的时间数值转为为Time类型 time.Parse("模板",str)
			第一个参数和上面一样为转换的模板,第二个参数为要转换的字符串
	*/
	s := "1997年10月10日"
	//s := "1997/10/10日"
	t3, err := time.Parse("2006年1月2日", s) //如果字符串不匹配模板格式,则返回错误信息
	if err != nil {
		fmt.Println(err) //parsing time "1997/10/10日" as "2006年1月2日": cannot parse "/10/10日" as "年"
	} else {
		fmt.Printf("%T\n", t3) //time.Time
		fmt.Println(t3)        //1997-10-10 00:00:00 +0000 UTC
	}

	//5.从时间对象去获取对应的具体的某些时间信息
	//5.1、获取t1时间的年月日
	year, month, day := t1.Date()
	fmt.Printf("year:%T, month:%T, day:%T\n", year, month, day) //year:int, month:time.Month, day:int
	fmt.Println(year, month, day)                               //2021 February 16
	//5.2获取时分秒
	hour, min, sec := t1.Clock()
	fmt.Printf("hour:%T, min:%T, sec:%T\n", hour, min, sec) //hour:int, min:int, sec:int
	fmt.Println(hour, min, sec)                             //3 54 37
	//5.3、单独获取个数据
	t1.Year()                 //获取年
	t1.Month()                //获取月
	t1.Day()                  //获取日
	t1.Hour()                 //获取时
	t1.Minute()               //获取分
	t1.Second()               //获取秒
	t1.Nanosecond()           //获取纳秒
	t1.YearDay()              //获取该年一共过了多少天
	fmt.Println(t1.Weekday()) //Tuesday 获取为周几
	//时间戳:指定日期距离1970年1月1日0点0分0秒的时间差值,单位为秒或纳秒
	t1.Unix()     //获取时间戳 单位/s
	t1.UnixNano() //获取时间戳 单位/ns

	//6.时间间隔
	//6.1、在原有时间的基础上去增加或减少时间
	fmt.Println(t1) //2021-02-16 03:54:37.561962676 +0800 CST m=+0.000074931
	//t4 := t1.Add(time.Hour * 24) //表示在该时间上加上一天
	t4 := t1.Add(time.Minute * 20) //表示在该时间上加上20分钟
	//t4 := t1.Add(time.Second * 20) //表示在该时间上加上20秒
	//t4 := t1.Add(time.Nanosecond * 20) //表示在该时间上加上20纳秒
	fmt.Println(t4)           //2021-02-16 04:14:37.561962676 +0800 CST m=+0.000074931
	t5 := t1.AddDate(1, 0, 0) //按日期去添加,参数分别是年月日
	fmt.Println(t5)           //t1基础上增加一年的时间

	//6.2、两个时间的差值
	d := t5.Sub(t1)
	fmt.Println(d) //8760h0m0s  8760小时0分0秒的意思

	//7.睡眠
	rand.Seed(time.Now().UnixNano())
	n := rand.Intn(10) + 1 //[1,10]返回的随即数
	//需要Duration类型,虽然其底层类型也是int64,但是因为使用了type定义,所以不是同一个类型,要去强转一下才能用
	time.Sleep(time.Duration(n) * time.Minute) //程序睡眠[0-10]秒再继续执行,这在很多语言中都有,操作基本一样

}

关于时间的常用操作,还有一些方法是需要搭配"通道"使用的,待学习到通道的时候再补上

本系列学习资料参考:千锋的茹姐

posted @ 2021-02-16 04:46  .Jochen  阅读(120)  评论(0编辑  收藏  举报