time包介绍
Go语言中的 time 包提供了 时间显示和时间格式字符串处理 等功能,处理和时间序列相关的数据时大多需要使用到time包
常用操作
获取当前时间
date数据可以通过字符串扫描获取、指定不易
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Printf("当前时间为:%v\n", now)
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)
}
简单计时
单纯的计时只需要要在程序开始之前和结束之后分别调用一次time.now( ),再获取这两次时间的间隔即可,实现如下:
start := time.Now()
solution()//某函数操作
end := time.Now()
fmt.Println("本次计算消耗时间为:", end.Sub(start))
实现休眠
这里有个小坑,正常休眠传入直接传入【数字】*【单位】既可以,如下
time.Sleep(10 * time.Second)//正常编译,休眠10s
但是数值值用变量表达的时候就会报错,原因是seleep其实要接受的是Duration型变量
var i = 10
time.Sleep(i * time.Second)//用i来代替就时编译通过不
该成如下即可
var i = 1000
time.Sleep(time.Duration(i) * time.Millisecond)
时间戳相关
- t.Unix()获取t的时间戳
- t.UnixNano获取当前t的纳秒级时间戳
- time.Unix(时间戳a)将时间戳转为time
判断时间t是周几可以用t.Weekday()方法
字符串解析与格式化
time数据类型中的Parse与Format是一对互逆的函数,使用时需要额外传入一个layout参数表示你想获得的时间格式。
注意:官方提供多种layout,具体可以点进time.Layout去看,推荐使用time包下的【常量名】来代表格式,比如你想要只精确到日的格式,那就选time.DateOnly作为layout;如果自定义格式作为layout,那么时间必须是指向"2006-01-02 15:04:05"
将string扫描成time
time.Parse(layout,"2023-02-09 15:22:12")
将time格式化为string
time.Format(layout,"2023-02-09 15:22:12")
time操作函数
获取当前时间的后一段时间,用add函数,传入时间间隔单位
t.add(time.Hour * 24) //后1天
t.add(time.Minute * 7) //后7分钟
t.add(time.Second * (-8)) //前8秒
时间比较
分别用Before、After、Equal去比较时间,Sub函数用于求两者时间间隔,以下是一个简单实践:
//用for循环遍历一个时间段
for current := start; current.Before(end) == true || current.Equal(end); current = current.Add(time.Hour * 24) {
temString := current.Format(myLayout) //转为string
fmt.Println(temString)
}