1、时间和日期相关函数,需要引入 time

package time

import “time”
time包提供了时间的显示和测量用的函数。日历的计算采用的是公历。

func Now() Time
Now返回当前本地时间。
Time 是结构体类型

type Time

type Time struct { // 内含隐藏或非导出字段 }
time类型:time.Time, 值: 2021-11-14 15:14:48.0798966 +0800 CST m=+0.012947301

func (Time) Year

func (t Time) Year() int
返回时间点t对应的年份。

func (Time) Month

func (t Time) Month() Month
返回时间点t对应那一年的第几月。

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func main() {
  7. now := time.Now()
  8. fmt.Printf("time类型:%T, 值: %v \n", now, now)
  9. fmt.Printf("年:%v \n", now.Year())
  10. fmt.Printf("月:%v \n", now.Month())
  11. fmt.Printf("月:%v \n", int(now.Month())) // 转成数字
  12. fmt.Printf("日:%v \n", now.Day())
  13. fmt.Printf("时:%v \n", now.Hour())
  14. fmt.Printf("分:%v \n", now.Minute())
  15. fmt.Printf("秒:%v \n", now.Second())
  16. }
  17. time类型:time.Time, 值: 2021-11-14 15:22:03.1406364 +0800 CST m=+0.013013401
  18. 年:2021
  19. 月:November
  20. 月:11
  21. 日:14
  22. 时:15
  23. 分:22
  24. 秒:3

格式化日期和时间

方式1,使用Sprintf或Printf

%d 表示为十进制
%02d
%d

  1. fmt.Printf("当前年月日: %d-%d-%02d %02d:%02d:%02d \n",
  2. now.Year(), now.Month(), now.Day(),
  3. now.Hour(), now.Minute(), now.Second())
  4. 当前年月日: 2021-11-14 15:35:58

func Sprintf(format string, a …interface{}) string
Sprintf根据format参数生成格式化的字符串并返回该字符串。
变量保存输出

  1. dataStr := fmt.Sprintf("xx当前年月日: %d-%d-%02d %02d:%02d:%02d \n",
  2. now.Year(), now.Month(), now.Day(),
  3. now.Hour(), now.Minute(), now.Second())
  4. fmt.Printf("dataStr类型: %T, 值:%s \n", dataStr, dataStr)
  5. // dataStr类型: string, 值:当前年月日: 2021-11-14 15:39:07

方式2,now.Format()

func (Time) Format

func (t Time) Format(layout string) string
Format根据layout指定的格式返回t代表的时间点的格式化文本表示。layout定义了参考时间:
Mon Jan 2 15:04:05 -0700 MST 2006
2006-01-02 15:04:05
Golang语言规定的时间,据说是设计者产生想法的时间

  1. now := time.Now()
  2. var curtime = now.Format("2006-01-02 15:04:05")
  3. fmt.Printf("curtime类型: %T, 值: %s \n", curtime, curtime)
  4. var time01 = now.Format("2006-01-02") // 年月日
  5. fmt.Printf("time01类型: %T, 值: %s \n", time01, time01)
  6. var time02 = now.Format("15:04:05") // 时分秒
  7. fmt.Printf("time02类型: %T, 值: %s \n", time02, time02)
  8. var time03 = now.Format("01") // 月份
  9. fmt.Printf("time03类型: %T, 值: %s \n", time03, time03)
  10. curtime类型: string, 值: 2021-11-14 15:53:44
  11. time01类型: string, 值: 2021-11-14
  12. time02类型: string, 值: 15:53:44
  13. time03类型: string, 值: 11

时间常量

type Duration int64
Duration类型代表两个时间点之间经过的时间,以纳秒为单位。可表示的最长时间段大约290年。

  1. const (
  2. Nanosecond Duration = 1 // 纳秒
  3. Microsecond = 1000 * Nanosecond // 微秒
  4. Millisecond = 1000 * Microsecond // 毫秒
  5. Second = 1000 * Millisecond // 秒
  6. Minute = 60 * Second // 分
  7. Hour = 60 * Minute // 时
  8. )
  9. // time.Second
  10. // 时间常量使用
  11. i := 0
  12. for {
  13. i++
  14. fmt.Println(i)
  15. // 休眠
  16. // time.Sleep(time.Second)
  17. time.Sleep(time.Millisecond * 100)
  18. if i >= 20 {
  19. break
  20. }
  21. }

获取当前unix时间戳和unixnano时间戳

作用是可以获取随机数字

func (Time) Unix

func (t Time) Unix() int64
Unix将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位秒)。

func (Time) UnixNano

func (t Time) UnixNano() int64
UnixNano将t表示为Unix时间,即从时间点January 1, 1970 UTC到时间点t所经过的时间(单位纳秒)。如果纳秒为单位的unix时间超出了int64能表示的范围,结果是未定义的。注意这就意味着Time零值调用UnixNano方法的话,结果是未定义的。
1970-01-01: 00:00:00

  1. now := time.Now()
  2. fmt.Printf("unix时间戳=%v, unixnano时间戳=%v\n", now.Unix(), now.UnixNano())
  3. // unix时间戳=1636877669, unixnano时间戳=1636877669185278600

练习实践

统计代码执行时间

  1. func test() {
  2. str := ""
  3. for i := 0; i < 100000; i++ {
  4. str += "hello" + strconv.Itoa(i)
  5. }
  6. // fmt.Println("test-str", str)
  7. }
  8. // 统计消耗时间
  9. var startNuix = time.Now().Unix()
  10. test()
  11. var endNuix = time.Now().Unix()
  12. fmt.Println("startNuix = ", startNuix)
  13. fmt.Println("endNuix = ", endNuix)
  14. var exectime = endNuix - startNuix
  15. fmt.Printf("exectime = %v", exectime)
  16. // startNuix = 1636878354
  17. // endNuix = 1636878359
  18. // exectime = 5