时间概念呢

时间戳

  • Unix时间戳(Unix timestamp)定义为从1970年01月01日00时00分00秒(UTC)起至现在经过的总秒数
  • 不论东西南北、在地球的每一个角落都是相同

日期格式

  • 字符串

python中转换关系py_time.png

go中转换关系go_time.png

获取时间相关函数

获取当前时间

  • 代码
  1. package main
  2. import (
  3. "log"
  4. "strconv"
  5. "time"
  6. )
  7. func numLen(n int64) int {
  8. return len(strconv.Itoa(int(n)))
  9. }
  10. func main() {
  11. now := time.Now()
  12. log.Printf("[当前时间对象为:%v]", now)
  13. log.Printf("[当前时间戳 秒级:%v][位数:%v]", now.Unix(), numLen(now.Unix()))
  14. log.Printf("[当前时间戳 毫秒级:%v][位数:%v]", now.UnixNano()/1e6, numLen(now.UnixNano()/1e6))
  15. log.Printf("[当前时间戳 纳秒级:%v][位数:%v]", now.UnixNano(), numLen(now.UnixNano()))
  16. log.Printf("[当前时间戳 纳秒小数部分:%v]", now.Nanosecond())
  17. /*
  18. 2021/07/17 16:34:10 [当前时间对象为:2021-07-17 16:34:10.2999431 +0800 CST m=+0.007295301]
  19. 2021/07/17 16:34:10 [当前时间戳 秒级:1626510850][位数:10]
  20. 2021/07/17 16:34:10 [当前时间戳 毫秒级:1626510850299][位数:13]
  21. 2021/07/17 16:34:10 [当前时间戳 纳秒级:1626510850299943100][位数:19]
  22. 2021/07/17 16:34:10 [当前时间戳 纳秒小数部分:299943100]
  23. */
  24. }

结论

  • 时间戳返回 int64
  • 10位数时间戳 是秒单位
  • 13位数时间戳 是毫秒单位
  • 19位数时间戳 是纳秒单位
  • 毫秒=纳秒/1e6

毫秒时间戳作用

  • prometheus默认查询就是毫秒

具体日期相关函数

  • 代码
  1. package main
  2. import (
  3. "log"
  4. "time"
  5. )
  6. func main() {
  7. now := time.Now()
  8. //返回日期
  9. year, month, day := now.Date()
  10. log.Printf("[通过now.Data获取][年:%d 月:%d 日:%d]", year, month, day)
  11. log.Printf("[直接获取年 %d]", now.Year())
  12. log.Printf("[直接获取月 %d]", now.Month())
  13. log.Printf("[直接获取日 %d]", now.Day())
  14. // 分 时 秒
  15. hour, minute, second := now.Clock()
  16. log.Printf("[通过now.Clock获取][时:%d 分:%d 秒:%d]", hour, minute, second)
  17. log.Printf("[直接获取时 %d]", now.Hour())
  18. log.Printf("[直接获取分 %d]", now.Minute())
  19. log.Printf("[直接获取秒 %d]", now.Second())
  20. // 星期几
  21. log.Printf("[直接获取星期几 %d]", now.Weekday())
  22. // 时区
  23. zone, offset := now.Zone()
  24. log.Printf("[直接获取时区 %v ,和东utc时区差 几个小时:%d]", zone, offset/3600)
  25. log.Printf("[今天是 %d年 中的第 %d天]", now.Year(), now.YearDay())
  26. /*
  27. 2021/07/17 16:44:57 [通过now.Data获取][年:2021 月:7 日:17]
  28. 2021/07/17 16:44:57 [直接获取年 2021]
  29. 2021/07/17 16:44:57 [直接获取月 7]
  30. 2021/07/17 16:44:57 [直接获取日 17]
  31. 2021/07/17 16:44:57 [通过now.Clock获取][时:16 分:44 秒:57]
  32. 2021/07/17 16:44:57 [直接获取时 16]
  33. 2021/07/17 16:44:57 [直接获取分 44]
  34. 2021/07/17 16:44:57 [直接获取秒 57]
  35. 2021/07/17 16:44:57 [直接获取星期几 6]
  36. 2021/07/17 16:44:57 [直接获取时区 CST ,和东utc时区差 几个小时:8]
  37. 2021/07/17 16:44:57 [今天是 2021年 中的第 198天]
  38. */
  39. }

格式化时间

  • Go 语言提供了时间类型格式化函数 Format(), 2006-01-02 15:04:05,也很好记忆(2006 1 2 3 4 5)

时间对象转字符串

  1. package main
  2. import (
  3. "log"
  4. "time"
  5. )
  6. func main() {
  7. now := time.Now()
  8. log.Printf("[全部 :%v]",now.Format("2006-01-02 15:04:05"))
  9. log.Printf("[只有年 :%v]",now.Format("2006"))
  10. log.Printf("[/分割 :%v]",now.Format("2006/01/02 15:04"))
  11. }

时间戳与日期字符串相互转化

  • 要先转成将时间戳转成 time.Time 类型再格式化成日期格式。
  1. package main
  2. import (
  3. "log"
  4. "time"
  5. )
  6. func main() {
  7. // 时间戳
  8. ts := time.Now().Unix()
  9. layout := "2006-01-02 15:04:05"
  10. // 构造时间对象
  11. t := time.Unix(ts, 0)
  12. log.Printf(t.Format(layout))
  13. }

日期字符串转时间戳

  • 解析时常用 time.ParseInLocation(),可以指定时区
  1. package main
  2. import (
  3. "log"
  4. "time"
  5. )
  6. func main() {
  7. tStr := "2021-07-17 16:52:59"
  8. layout := "2006-01-02 15:04:05"
  9. t1, _ := time.ParseInLocation(layout, tStr, time.Local)
  10. t2, _ := time.ParseInLocation(layout, tStr, time.UTC)
  11. log.Printf("[ %s的 CST时区的时间戳为 :%d]", tStr, t1.Unix())
  12. log.Printf("[ %s的 UTC时区的时间戳为 :%d]", tStr, t2.Unix())
  13. log.Printf("[UTC - CST =%d 小时]", (t2.Unix()-t1.Unix())/3600)
  14. }

时间差

  1. package main
  2. import (
  3. "log"
  4. "time"
  5. )
  6. var layout = "2006-01-02 15:04:05"
  7. func tTostr(t time.Time) string {
  8. return time.Unix(t.Unix(), 0).Format(layout)
  9. }
  10. func main() {
  11. now := time.Now()
  12. log.Printf("[当前时间为:%v]", tTostr(now))
  13. // 1小时1分1秒后
  14. t1, _ := time.ParseDuration("1h1m1s")
  15. m1 := now.Add(t1)
  16. log.Printf("[ 1小时1分1秒后时间为:%v]", tTostr(m1))
  17. // 1小时1分1秒前
  18. t2, _ := time.ParseDuration("-1h1m1s")
  19. m2 := now.Add(t2)
  20. log.Printf("[ 1小时1分1秒 前时间为:%v]", tTostr(m2))
  21. // sub计算两个时间差
  22. sub1 := now.Sub(m2)
  23. log.Printf("[ 时间差 :%s 相差小时数:%v 相差分钟数:%v ]", sub1.String(), sub1.Hours(), sub1.Minutes())
  24. t3, _ := time.ParseDuration("-3h3m3s")
  25. m3 := now.Add(t3)
  26. log.Printf("[time.since 当前时间与t的时间差 :%v]", time.Since(m3))
  27. log.Printf("[time.until t 当前时间的时间差 :%v]", time.Until(m3))
  28. m4 := now.AddDate(0, 0, 5)
  29. log.Printf("[5天后 的时间 :%v]", m4)
  30. }

日期比较

  1. package main
  2. import (
  3. "log"
  4. "time"
  5. )
  6. var layout = "2006-01-02 15:04:05"
  7. func tTostr(t time.Time) string {
  8. return time.Unix(t.Unix(), 0).Format(layout)
  9. }
  10. func main() {
  11. now := time.Now()
  12. t1, _ := time.ParseDuration("1h")
  13. m1 := now.Add(t1)
  14. log.Printf("[a.after(b) a在b之后 :%v]", m1.After(now))
  15. log.Printf("[a.Before(b) a在b之前 :%v]", now.Before(m1))
  16. log.Printf("[a.Equal(b) a=b :%v]", m1.Equal(now))
  17. }