Go 编程 | 连载 32 - 时间与日期
一、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
}
转载自:https://juejin.cn/post/7136560403227623460