10 time
2025/9/26大约 2 分钟
10 time
在日常开发过程中,经常会有一些需要计算时间的需求,如做一个日志组件打印当前时间、测定某个操作执行了多长时间等,Golang 中主要是使用 time
包来完成相关操作。
获取当前时间
使用 time.Now()
函数获取当前时间对象:
now := time.Now() // 获取当前时间
fmt.Printf("当前时间: %v\n", now)
// 获取各个时间分量
year := now.Year() // 年
month := now.Month() // 月
day := now.Day() // 日
hour := now.Hour() // 小时
minute := now.Minute() // 分钟
second := now.Second() // 秒
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n",
year, month, day, hour, minute, second)
时间格式化
Go 语言使用特定的时间模板进行格式化,模板时间为:2006-01-02 15:04:05
,这是 Go 的诞生时间,说实话多少沾点自恋(。
now := time.Now()
// 24小时制
fmt.Println(now.Format("2006-01-02 15:04:05"))
// 12小时制
fmt.Println(now.Format("2006-01-02 03:04:05"))
时间戳操作
获取时间戳
时间戳是自 1970 年 1 月 1 日(UTC)至当前时间的总秒数,也称为 Unix 时间戳。
now := time.Now()
timestamp1 := now.Unix() // 秒级时间戳
timestamp2 := now.UnixNano() // 纳秒级时间戳
fmt.Printf("秒级时间戳: %v\n", timestamp1)
fmt.Printf("纳秒级时间戳: %v\n", timestamp2)
时间戳转时间
func unixToTime(timestamp int64) {
timeObj := time.Unix(timestamp, 0) // 转换为时间格式
fmt.Printf("时间: %d-%02d-%02d %02d:%02d:%02d\n",
timeObj.Year(), timeObj.Month(), timeObj.Day(),
timeObj.Hour(), timeObj.Minute(), timeObj.Second())
}
func main() {
unixToTime(1587880013)
// 或者使用格式化
var timestamp int64 = 1587880013
t := time.Unix(timestamp, 0)
fmt.Println(t.Format("2006-01-02 15:04:05"))
}
字符串转时间戳
t1 := "2019-01-08 13:50:30"
timeTemplate := "2006-01-02 15:04:05"
stamp, _ := time.ParseInLocation(timeTemplate, t1, time.Local)
fmt.Println(stamp.Unix()) // 输出: 1546926630
时间间隔
time.Duration
表示两个时间点之间的时间间隔,以纳秒为单位:
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
时间操作方法
时间运算
func main() {
now := time.Now()
// Add: 时间加上时间间隔
later := now.Add(time.Hour) // 当前时间加1小时
fmt.Println("1小时后:", later)
// Sub: 计算两个时间的差值
duration := later.Sub(now)
fmt.Println("时间差:", duration)
}
时间比较
func main() {
t1 := time.Now()
time.Sleep(time.Second)
t2 := time.Now()
fmt.Println("t1 == t2:", t1.Equal(t2)) // false
fmt.Println("t1 < t2:", t1.Before(t2)) // true
fmt.Println("t1 > t2:", t1.After(t2)) // false
}
定时器
time 包当然也提供了定时器的方法,这个也是内置的方法:
func main() {
ticker := time.NewTicker(time.Second) // 1秒间隔的定时器
defer ticker.Stop()
n := 0
for t := range ticker.C {
fmt.Println("定时执行:", t)
n++
if n > 5 {
break
}
}
}