一、Go 语言的 time
标准库
Go 语言的 time
标准库提供了时间交互以及测量时间的函数和方法。
获取当前时间 Now
要在 Go 语言中获取当前时间可以使用 time
包下的 Now
方法。
func main(){ t := time.Now() fmt.Println(t) // 2022-08-27 12:18:47.399006 +0800 CST m=+0.000088462 } 复制代码
输出的时间中的 CST
表示时区,如果计算机中设置的时区不同,那么输出的所处的时间也不一样,也就是说 Now
获取的时间是来自底层操作系统的时间。
程序暂停 Sleep
Java 中可以通过 Thread.sleep()
来让线程休眠,从而使程序暂停执行,Go 中的 time
包下的 Sleep
函数可以让程序暂停或者休眠指定的时间。
func main(){ fmt.Println("要开始休眠了.....") time.Sleep(3 * time.Second) fmt.Println("休眠 3s 结束.....") } 复制代码
执行上述代码,输出结果如下:
要开始休眠了..... 休眠 3s 结束..... 复制代码
执行该程序时,观察控制台内容输出的时间,可以确定两次输出时间间隔为 3s,其中 time.Second
表示单位为 s,也可以选择 time.Millisecond
或者 time.Minute
等其他时间单位。
重复执行
使用 Ticker 结构体的实例化对象可以让程序在指定的时间间隔下重复执行, time.Tick
函数可以返回一个 Ticker 对象
func main(){ c := time.Tick(3 * time.Second) for t := range c { fmt.Printf("time is now %v\n", t) } } 复制代码
执行上述代码,输出结果如下:
time is now 2022-08-27 12:36:10.594926 +0800 CST m=+3.001155491 time is now 2022-08-27 12:36:13.594966 +0800 CST m=+6.001165447 time is now 2022-08-27 12:36:16.595 +0800 CST m=+9.001168869 复制代码
如果不手动停止程序,程序会一直执行。
二、时间与字符串的转换
Go 中将时间转换成字符串需要使用到 Format
函数,首先使用 time.Date
函数创建一个 Time
结构体实例化对象。
接着使用这个实例化对象调用 Format
函数就可以返回一个字符串类型的时间
func main() { timeType := time.Date(2022, 8, 27, 12, 00, 00, 0,time.Local) fmt.Printf("%v\n", timeType) // 2022-08-27 12:00:00 +0800 CST fmt.Printf("%T\n", timeType) // time.Time layout := "2006-01-02 15:04:05" timeStr := timeType.Format(layout) fmt.Printf("%v\n", timeStr) // 2022-08-27 12:00:00 fmt.Printf("%T\n", timeStr) // string } 复制代码
其中 layout 表示转换成字符串类型的格式,要注意这里定义的 layout 时间是 Go 语言诞生的时间,不可以使用其他时间,除此之外 Go 中还定义了其他形式的 layout 常量。
字符串转换成时间类型也需要这样一个 layout 以及 Parse
函数
func main(){ t := "2022-09-08 22:04:19" layout := "2006-01-02 15:04:05" timeType, err := time.Parse(layout, t) if err != nil { log.Fatal(err) } fmt.Printf("%v\n", timeType) // 2022-09-08 22:04:19 +0000 UTC fmt.Printf("%T\n", timeType) // time.Time } 复制代码
在字符串转成时间对象之后,就可以通过 Time
结构体对象来获取字符串时间中共的 Year, Month, Day, WeekDay 等信息
字符串转成时间和时间转成字符串不同的是:
- 字符串转成时间需要使用
time.Parse
函数,除了返回一个时间对象还会返回一个 err。 - 时间转换成字符串需要使用到实例化的
Time
结构体调用Format
函数,该函数只返回一个 string。
三、时间的加减与比较
Time
结构体除了可以获取对象中的年月日等信息外,还可以通过 Add
和 Sub
函数实现时间的加减等一些其他的操作。
func main(){ t := "2022-09-08 22:04:19" layout := "2006-01-02 15:04:05" timeType, err := time.Parse(layout, t) if err != nil { log.Fatal(err) } futureTime := timeType.Add(24 * time.Hour) fmt.Printf("%v\n", futureTime) diff := futureTime.Sub(timeType) fmt.Printf("%v\n", diff) } 复制代码
执行上述代码,输出结果如下:
2022-09-09 22:04:19 +0000 UTC 24h0m0s 复制代码
After
, Before
, Equal
三个函数可以用来比较时间对象
func main(){ t1 := "2022-09-08 22:04:19" t2 := "2022-09-09 22:04:19" layout := "2006-01-02 15:04:05" timeIns1, err := time.Parse(layout, t1) if err != nil { log.Fatal(err) } timeIns2, err := time.Parse(layout, t2) if err != nil { log.Fatal(err) } fmt.Println(timeIns1.After(timeIns2)) // false fmt.Println(timeIns1.Before(timeIns2)) // true fmt.Println(timeIns1.Equal(timeIns2)) // false }