1.time.Now()获取时间基本信息
Time类型表示时间。我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息
func getBaseTime(){
now := time.Now()
fmt.Println("基本信息",now)
//基本信息 2021-07-27 10:39:49.946613 +0800 CST m=+0.000707429
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",year,month,day,hour,minute,second)
//2021-07-27 10:43:53
}
2.时间戳Unix()
通过time.Now().Unix()获取
//10位数的时间戳是以 秒 为单位;
//13位数的时间戳是以 毫秒 为单位;
//19位数的时间戳是以 纳秒 为单位;
func getUnix(){
now := time.Now()
unix := now.Unix()
fmt.Println("当前时间戳(秒)",unix)
//当前时间戳(秒) 1627354773
unixNano := now.UnixNano()
fmt.Println("当前时间戳(纳秒)",unixNano)
//当前时间戳(纳秒) 1627354895305439000
unixHaoMiao := now.UnixNano()/1e6
fmt.Println("当前时间戳(毫秒)",unixHaoMiao)
//当前时间戳(毫秒) 1627354968330
fmt.Printf("时间戳(纳秒转换为秒):%v;\n",time.Now().UnixNano() / 1e9)
// 时间戳(纳秒转换为秒):1627354968;
}
//time.Unix()将时间戳转换为时间格式
func getTime(){
unix := time.Now().Unix() //获取时间戳
timeObj := time.Unix(unix,0)
year := timeObj.Year() //同理 获取年月日 小时
fmt.Println("时间戳",unix) //时间戳 1627355602
fmt.Println("时间格式",timeObj) //时间格式 2021-07-27 11:13:22 +0800 CST
fmt.Println("获取年",year) //获取年 2021
}
3.时间间隔
time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。time.Duration表示一段时间间隔,可表示的最长时间段大约290年
//time包中定义的时间间隔类型的常量如下
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
//例如:time.Duration表示1纳秒,time.Second表示1秒。
4.时间操作
- Add()
我们在日常的编码过程中可能会遇到要求时间+时间间隔的需求,Go语言的时间对象有提供Add方法如下:
func timeAdd(){
now := time.Now()
lastTime := now.Add(time.Hour) //间隔一个小时
fmt.Println(now)
fmt.Println(lastTime)
//2021-07-27 11:26:52.521108 +0800 CST m=+0.000536457
//2021-07-27 12:26:52.521108 +0800 CST m=+3600.000536457
//lastTime := now.Add(-time.Hour)表示往前一个小时
}
2.Sub()
求两个时间之间的差值
func timeSub(){
strTime := time.Date(2021, 07, 27,1,0,0,0,time.Local)
lasTime := time.Date(2021, 07, 27,0,0,0,0,time.Local)
jg :=strTime.Sub(lasTime)
fmt.Println(jg)
//1h0m0s
}
3.Equal()
两个时间是否相等,需要考虑时区 返回Boolean类型
func timeEqual(){
strTime := time.Date(2021, 07, 27,1,0,0,0,time.Local)
lasTime := time.Date(2021, 07, 27,0,0,0,0,time.Local)
jg :=strTime.Equal(lasTime)
fmt.Println(jg)
//false
}
4.Before()和After()
表示在时间之前和之后 返回Boolean类型
func timeBefore(){
strTime := time.Date(2021, 07, 27,1,0,0,0,time.Local)
lasTime := time.Date(2021, 07, 27,0,0,0,0,time.Local)
jg :=strTime.Before(lasTime)
jg2 :=strTime.After(lasTime)
fmt.Println(jg) //false
fmt.Println(jg2) //true
}
5.定时器
使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)。
func timeTick(){
tick := time.Tick(time.second) //定义一个一秒钟执行一次的定时器
for i := range tick {
fmt.Println(i)
}
//2021-07-27 11:56:33.433991 +0800 CST m=+77.005829903
//2021-07-27 11:56:34.433991 +0800 CST m=+77.005829903
//...
}
6.时间格式化
时间类型有一个自带的方法Format进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分(记忆口诀为2006 1 2 3 4)。也许这就是技术人员的浪漫吧。
补充:如果想格式化为12小时方式,需指定PM。
func timeFormat(){
now := time.Now()
fmt.Println(now.Format("2006-01-02"))
//2021-07-27
}
解析字符串格式的时间
now := time.Now()
fmt.Println(now)
// 加载时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
return
}
// 按照指定时区和指定格式解析字符串时间
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2019/08/04 14:15:20", loc)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(timeObj)
fmt.Println(timeObj.Sub(now))