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]秒再继续执行,这在很多语言中都有,操作基本一样
}
关于时间的常用操作,还有一些方法是需要搭配"通道"使用的,待学习到通道的时候再补上
本系列学习资料参考:千锋的茹姐