Go 编程 | 连载 32 - 时间与日期

简介: 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 常量。

image.png

字符串转换成时间类型也需要这样一个 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 结构体除了可以获取对象中的年月日等信息外,还可以通过 AddSub 函数实现时间的加减等一些其他的操作。

image.png

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
}


相关文章
|
13天前
|
Serverless Go
Go to Learn Go之时间日期
Go to Learn Go之时间日期
32 8
|
17天前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
17天前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
17天前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
17天前
|
存储 安全 编译器
go语言编程系列(六)
go语言编程系列(六)
|
17天前
|
自然语言处理 Java 测试技术
go语言编程系列(二)
go语言编程系列(二)
|
17天前
|
编译器 Go
go语言编程系列(三)
go语言编程系列(三)
|
17天前
|
安全 Java Go
Go语言编程系列(一)
Go语言编程系列(一)
|
1月前
|
Kubernetes Go Docker
在K8s编程中如何使用Go
一文带你了解在K8s编程中如何使用Go
47 3
|
2月前
|
数据库连接 Go API
Golang中的25个常见错误:更好地进行go编程的综合指南
Golang中的25个常见错误:更好地进行go编程的综合指南