Go语言提供的time
包提供了一系列实用的方法,用于处理时间、时间格式化、时间段等。这篇笔记我们简单学习time
的用法。
Go语言中获取当前时间非常简单,调用Now()
方法即可。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now())
}
运行输出:
2023-04-08 22:12:03.1563724 +0800 CST m=+0.001021801
Go语言time
模块有一个极为糟糕、让人眼前一黑的垃圾设计,它使用一个特殊的时间2006-01-02 15:04:05
作为格式化模板,而非类似Java等使用形如yyyyMMdd
的形式,这个想当然的时间令人费解而且记错某个数字可能就会引发一场灾难!下面是Go语言解析字符串为Time
对象和格式化Time
对象的例子代码。
package main
import (
"fmt"
"time"
)
func main() {
const layout1 string = "2006-01-02 15:04:05"
const layout2 string = "2006/01/02 15:04:05"
// 解析字符串为Time对象
t, err := time.Parse(layout1, "2023-04-08 22:21:00")
if err != nil {
fmt.Println(err)
return
}
// 格式化Time对象为字符串
s := t.Format(layout2)
fmt.Println(s)
}
输出结果:
2023/04/08 22:00:00
除了手写类似2006-01-02 15:04:05
这种格式化模板,time
模块内部定义了一些常量,不过都是一些不适合展示的标准格式,较少用到。
除了Time
结构体,time
包还提供了一个Duration
结构体,用于表示时间段。我们可以使用ParseDuration()
等方法创建时间段。获得的Duration
可以用于和时间点进行加减运算。
package main
import (
"fmt"
"time"
)
func main() {
dua1, err := time.ParseDuration("100s")
if err != nil {
fmt.Println(err)
return
}
dua2 := 100 * time.Second
fmt.Println(dua1)
fmt.Println(dua2)
}
以上dua1
和dua2
都是一个100秒的时间段,即1分40秒。
下面例子我们对当前时间增加了100秒。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
now = now.Add(100 * time.Second)
fmt.Println(now)
}
下面例子计算了当前时间到一个过去的指定日期的差。
package main
import (
"fmt"
"time"
)
func main() {
const layout string = "2006-01-02 15:04:05"
now := time.Now()
past, err := time.Parse(layout, "2023-04-01 00:00:00")
if err != nil {
fmt.Println(err)
return
}
dua := now.Sub(past)
fmt.Println(dua)
}