time 提供测量和显示时间的功能
基本使用
func main() {
now := time.Now()
fmt.Printf("now: %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)
fmt.Printf("%T,%T,%T %T,%T,%T\n", year, month, day, hour, minute, second)
}
/*
2022-12-21 10:22:03
int,time.Month,int int,int,int
*/
时间戳
时间戳多应用与 Web 开发中的 cookies 有效期,接口加密, Redis 中的 key 有效期等
时间戳是 1970年1月1日 ( 08:00:00GTM )至今的总毫秒数,也称为 Unix 时间戳
func main() {
now := time.Now()
fmt.Printf("now.Unix(): %T\n", now.Unix()) // now.Unix(): int64
fmt.Printf("now.Unix(): %v\n", now.Unix()) // now.Unix(): 1671589570
}
获取纳秒时间戳
fmt.Printf("now.UnixNano(): %v\n", now.UnixNano())
时间戳转为普通的时间格式
可以通过 time.Unix 将时间戳转为当前时间格式
func timeStampToTime() {
timestamp := time.Now().Unix()
timeObj := time.Unix(timestamp, 0) // 将时间戳转为时间格式
fmt.Printf("timeObj: %v\n", timeObj) // timeObj: 2022-12-21 10:31:04 +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)
// 2022-12-21 10:31:04
}
操作时间
Add
- 只能加时分秒
// 输出纳秒时间戳
func add(h, m, s, mls, msc, ns time.Duration) {
now := time.Now()
fmt.Println(now.Add(time.Hour*h + time.Minute*m + time.Second*s + time.Millisecond*mls + time.Microsecond*msc + time.Nanosecond*ns))
}
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
Sub
func sub() {
now := time.Now()
// 在原来的时间上加1小时
targetTime := now.Add(time.Hour)
// 目标时间与此时相比差1h0m0s
fmt.Printf("targetTime.Sub(now): %v\n", targetTime.Sub(now))
}
Equal
判断时间是否相等,不同时区也可以正确比较
func (t Time) Equal(u Time) bool
Before
如果 t 的时间点在 u 之前,返回 true
func (t Time) Before(u Time) bool
After
如果 t 的时间点在 u 之后,返回 true
func (t Time) After(u Time) bool
定时器
使用 time.Tick(时间间隔) 来设置定时器,定时器本质是一个通道 channel
func tick() {
ticker := time.Tick(time.Second) // 定义一个1s间隔的定时器
for i := range ticker {
fmt.Printf("i: %v\n", i)
}
}
时间格式化
时间类型自带方法 Format 进行格式化, go 语言中格式化时间模板不是常见的 Y-m-d H:M:S ,而是 go 诞生的时间2006年1月2号15点04分 ( 2006 1 2 3 4 )
func test() {
t := time.Now()
fmt.Println(t.Format("2006/01/02 15:04")) // 2022/12/21 10:54
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-12-21 10:54:09
fmt.Println(t.Format("15:04 2006/01/02")) // 10:55 2022/12/21
}
解析字符串格式的时间
func main() {
now := time.Now()
// 加载时区
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
// 按照指定时区指定格式解析字符串时间
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/12/21 10:15:20", loc)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Printf("timeObj: %v\n", timeObj) // timeObj: 2022-12-21 10:15:20 +0800 CST
fmt.Printf("timeObj.Sub(): %v\n", timeObj.Sub(now)) // timeObj.Sub(): -44m1.3048818s
}