# 5.10、Golang标准库-time time包提供测量和显示时间 ## 获取时间 示例 ```go package main import ( "fmt" "time" ) func main() { // 获取当前时间 now := time.Now() fmt.Printf("now: %v\n", now) // now: 2022-10-09 22:26:46.28154 +0800 CST m=+0.000130816 // 年 月 日 时 分 秒 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) // 2022-10-09 22:28:48 fmt.Printf("%T, %T, %T, %T, %T, %T, %T\n", now, year, month, day, hour, minute, second) // time.Time, int, time.Month, int, int, int, int } ``` ## 时间戳 1970年1月1日 至当前时间的总毫秒数 ```go package main import ( "fmt" "time" ) func main() { // 获取当前时间 now := time.Now() // 毫秒时间戳 fmt.Printf("now: %T %v\n", now.Unix(), now.Unix()) // now: int64 1665325944 // 纳秒时间戳 fmt.Printf("now: %T %v\n", now.UnixNano(), now.UnixNano()) // now: int64 1665326004937102000 } ``` ## 时间格式和时间戳转换 ```go package main import ( "fmt" "time" ) func main() { // 获取当前时间 now := time.Now() // 时间格式获取时间戳 timestamp := now.Unix() fmt.Printf("timestamp: %v\n", timestamp) // timestamp: 1665326148 // 时间戳转为时间格式 t := time.Unix(timestamp, 0) fmt.Printf("t: %v\n", t) // t: 2022-10-09 22:35:48 +0800 CST } ``` ## 操作时间 常量枚举 ```go const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute ) ``` 示例 ```go package main import ( "fmt" "time" ) func main() { // 获取当前时间 now := time.Now() fmt.Printf("now: %v\n", now) // now: 2022-10-09 22:38:21.99582 +0800 CST m=+0.000247516 // 增加 3 分钟 t := now.Add(time.Minute * 3) fmt.Printf("t: %v\n", t) // t: 2022-10-09 22:41:21.99582 +0800 CST m=+180.000247516 // 时间差 diff := t.Sub(now) fmt.Printf("diff: %v\n", diff) // diff: 3m0s // 时间比较 相等 ret1 := t.Equal(now) fmt.Printf("ret1: %v\n", ret1) // ret1: false // 时间比较 之前 ret2 := t.Before(now) fmt.Printf("ret2: %v\n", ret2) // ret2: false // 时间比较 之后 ret3 := t.After(now) fmt.Printf("ret3: %v\n", ret3) // ret3: true } ``` ## 定时器 ```go package main import ( "fmt" "time" ) func main() { // 每隔两秒执行一次 ticker := time.Tick(time.Second * 2) for i := range ticker { fmt.Printf("i: %v\n", i) } // i: 2022-10-09 22:45:37.026807 +0800 CST m=+2.000242470 // i: 2022-10-09 22:45:39.030351 +0800 CST m=+4.003789519 // i: 2022-10-09 22:45:41.03117 +0800 CST m=+6.004610715 } ``` ## 时间格式化 golang诞生时间: 2006年1月2日 15点04分,记忆口诀:2006 12345 ```go package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Printf("now.Format(): %v\n", now.Format("2006-01-02 15:04:05")) // now.Format(): 2022-10-09 22:49:20 } ``` ## 解析字符串格式的时间 ```go package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Printf("now: %v\n", now) // now: 2022-10-09 22:54:22.004375 +0800 CST m=+0.000089638 // 加载时区 loc, err := time.LoadLocation("Asia/Shanghai") if err != nil { fmt.Printf("err: %v\n", err) return } // 按照指定时区指定格式解析字符串格式的时间 t, err2 := time.ParseInLocation("2006-01-02 15:04:05", "2022-10-09 22:49:20", loc) if err2 != nil { fmt.Printf("err2: %v\n", err2) return } fmt.Printf("t: %v\n", t) // t: 2022-10-09 22:49:20 +0800 CST } ```