1. 常用函数和方法

  1. 1. time.Now()
  2. Func: func Now() Time // 取变量 now := time.Now()
  3. Man: Now返回当前本地时间,注意为 Time struct 类型
  4. 2. time.Now() 中具体时间信息
  5. Func: func (t Time) Year() int // 年
  6. func (t Time) Month() Month // 月,可强转为int
  7. func (t Time) Day() int // 日
  8. func (t Time) Hour() int // 时(0-23)
  9. func (t Time) Minute() int // 分
  10. func (t Time) Second() int // 秒
  11. func (t Time) Nanosecond() int // 纳秒
  12. func (t Time) YearDay() int // 一年中的第多少天
  13. func (t Time) Zone() (name string, offset int) // 时区和相对于UTC的偏移量(秒)
  14. 3. 取时间戳
  15. Func: func (t Time) Unix() int64 // 从1970-01-01 00:00:00 UTC 到现在的秒数
  16. func (t Time) UnixNano() int64 // 从1970-01-01 00:00:00 UTC 到现在的纳秒数
  17. 4. 时间比较
  18. Func: func (t Time) After(u Time) bool // t 在 u 之后为真
  19. func (t Time) Before(u Time) bool // t 在 u 之前为真
  20. func (t Time) Equal(u Time) bool // t 与 u 相等为真
  21. 5. 时间运算
  22. Func: func (t Time) AddDate(years int, months int, days int) Time // 加上指定时间,参数支持负数
  23. func (t Time) Sub(u Time) Duration // 时间相减
  24. 6. 格式化时间为字符串
  25. Func: func (t Time) Format(layout string) string // layout必须为"2006-01-02 15:04:05"的时刻
  26. 7. 其它格式转时间格式
  27. Func: func Parse(layout, value string) (Time, error) // 将字符串格式转为为 Time
  28. func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time // 转为Time,loc为时区
  29. func Unix(sec int64, nsec int64) Time // 将秒和纳秒转为Time
  30. 8. time.Sleep()
  31. Func: func Sleep(d Duration)
  32. Man: Sleep阻塞当前go进程至少d代表的时间段。d<=0时,Sleep会立刻返回
  33. 9. 定时器
  34. type Ticker struct {
  35. C <-chan Time // 周期性传递时间信息的通道,容量为1
  36. // 内含隐藏或非导出字段
  37. }
  38. 10. NewTicker()
  39. Func: func NewTicker(d Duration) *Ticker
  40. Man: 返回定时器,每隔 d 时间就会向定时器中发送一个时间戳.使用完毕后需要手动关闭
  41. 11. 关闭计时器
  42. Func: func (t *Ticker) Stop()
  43. Man: 关闭不必要的定时器
  44. 12. Tick()
  45. Func: func Tick(d Duration) <-chan Time
  46. Man: 返回一个 Ticker.C 的通道,一般在不需要关闭定时器的任务中使用,比如项目中的计划任务
  47. 12. 常量
  48. Nanosecond Duration = 1
  49. Microsecond = 1000 * Nanosecond
  50. Millisecond = 1000 * Microsecond
  51. Second = 1000 * Millisecond
  52. Minute = 60 * Second
  53. Hour = 60 * Minute

2. 案例

2.1. 取当前时间信息

  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. )
  7. func main() {
  8. // 取当前时间
  9. fmt.Println("当前本地时间:", time.Now()) // 当前本地时间
  10. fmt.Println("当前UTC时间:", time.Now().UTC()) // 当前UTC时间
  11. fmt.Println(strings.Repeat("--", 20))
  12. // 格式化时间, 将time转为格式化好的字符串
  13. now := time.Now()
  14. timeStr := fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", now.Year(), now.Month(),now.Day(),
  15. now.Hour(),now.Minute(),now.Second())
  16. timeRes := now.Format("2006-01-02 15:04:05")
  17. fmt.Printf("timeStr: type=%T value=%q\n", timeStr, timeStr)
  18. fmt.Printf("timeRes: type=%T value=%q\n", timeRes, timeRes)
  19. fmt.Println(strings.Repeat("--", 20))
  20. // 获取时间戳
  21. fmt.Printf("秒数时间戳:%d; 纳秒时间戳:%d\n", now.Unix(), now.UnixNano())
  22. }
  1. [root@heyingsheng src]# go run studygo/day03/15-time/main.go
  2. 当前本地时间: 2020-03-22 22:06:57.2284622 +0800 CST m=+0.001994401
  3. 当前UTC时间: 2020-03-22 14:06:57.2494063 +0000 UTC
  4. ----------------------------------------
  5. timeStr: type=string value="2020-03-22 22:06:57"
  6. timeRes: type=string value="2020-03-22 22:06:57"
  7. ----------------------------------------
  8. 秒数时间戳:1584886017; 纳秒时间戳:1584886017250438600

2.2. 休眠函数

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. for i:=0;i<10;i++ {
  8. fmt.Printf("%s --> %d \n", time.Now().Format("15:04:05"), i)
  9. time.Sleep(time.Millisecond * 500)
  10. }
  11. }
  1. [root@heyingsheng src]# go run studygo/day03/15-time/sleep.go
  2. 22:11:34 --> 0
  3. 22:11:34 --> 1
  4. 22:11:35 --> 2
  5. 22:11:35 --> 3
  6. 22:11:36 --> 4
  7. 22:11:36 --> 5
  8. 22:11:37 --> 6
  9. 22:11:37 --> 7
  10. 22:11:38 --> 8
  11. 22:11:38 --> 9

2.3. 统计代码时间

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func f0(n int) int {
  7. ret := 1
  8. if n > 2 {
  9. ret = f0(n-1) + f0(n-2)
  10. }
  11. return ret
  12. }
  13. func f1(n int) int {
  14. x, y := 1, 1
  15. for i:=3; i<=n; i++ {
  16. x += y
  17. y = x - y
  18. }
  19. return x
  20. }
  21. func main() {
  22. start := time.Now().UnixNano()
  23. ret0 := f0(45)
  24. stop1 := time.Now().UnixNano()
  25. ret1 := f1(45)
  26. stop2 := time.Now().UnixNano()
  27. fmt.Printf("f0(50): time=%dms value=%d\n", (stop1-start)/1000/1000, ret0)
  28. fmt.Printf("f1(50): time=%dms value=%d\n", (stop2-stop1)/1000/1000, ret1)
  29. }
  1. [root@heyingsheng src]# go run studygo/day03/15-time/const.go
  2. f0(50): time=4125ms value=1134903170
  3. f1(50): time=0ms value=1134903170

2.4. 定时器

定时器的应用非常广泛,在代码中的计划任务就常用这种方式实现,或者在任务超时退出的场合也会使用。

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. go func() {
  8. tick := time.Tick(time.Second * 5)
  9. for v := range tick {
  10. fmt.Printf("定时任务, time:%s\n", v)
  11. }
  12. }()
  13. select {}
  14. }
  1. [root@heyingsheng day26]# go run main.go
  2. 定时任务, time:2020-09-03 22:25:19.0521376 +0800 CST m=+5.000276201
  3. 定时任务, time:2020-09-03 22:25:24.052156 +0800 CST m=+10.000294501
  4. 定时任务, time:2020-09-03 22:25:29.0524934 +0800 CST m=+15.000632101
  5. 定时任务, time:2020-09-03 22:25:34.0524382 +0800 CST m=+20.000576801