Golang in代码解析时间
在开发中,我们时常需要处理时间相关的数据信息,比如访问日志,事件记录等等。在Golang中,时间处理是一个非常常见的需求。那么在Golang中如何操作时间呢?本文将对此进行讲解。
Golang中的时间类型
Golang中提供了两种时间类型表示方式:time.Time和time.Duration。
time.Time表示时间点,包含年月日时分秒时区信息,通常用于时间的存储、比较和运算等场合。它的定义如下:
type Time struct {
wall uint64
ext int64
loc *Location
}
time.Duration表示时间段,精度为纳秒,通常用于计算时间差等场合。它的定义如下:
type Duration int64
时间的获取
获取时间可以使用time.Now()方法,它会返回当前本地时间:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now)
}
输出结果如下:
2021-07-13 16:58:28.189652 +0800 CST m=+0.000074596
也可以获取UTC时间:
utc := time.Now().UTC()
fmt.Println(utc)
输出结果如下:
2021-07-13 08:58:28.190379 +0000 UTC
时间的格式化与解析
在程序中通常需要将时间格式化为字符串输出,或者将字符串解析为时间。
时间格式化
在Golang中,可以通过time.Time类型的Format()方法将时间格式化为指定的字符串形式。Format()方法需要传入一个字符串作为参数,该字符串指定各项时间信息的展示形式。常用的格式化参数如下:
| 格式化参数 | 说明 |
|---|---|
| 2006 | 年份 |
| 01 | 月份 |
| 02 | 日 |
| 15 | 小时 |
| 04 | 分钟 |
| 05 | 秒 |
| .999999 | 纳秒 |
| Mon | 英文月份 |
| PM | 上午或下午 |
| -0700 | 时区 |
例如将当前时间格式化为”2006-01-02 15:04:05″的形式:
t := time.Now()
fmt.Println(t.Format("2006-01-02 15:04:05"))
输出结果如下:
2021-07-13 17:13:16
时间解析
将字符串解析为时间可以使用time.Parse()方法,该方法需要传入两个参数:时间字符串和格式化参数。
例如将”2021-07-13 17:13:16″解析成对应的时间:
t, _ := time.Parse("2006-01-02 15:04:05", "2021-07-13 17:13:16")
fmt.Println(t)
输出结果如下:
2021-07-13 17:13:16 +0000 UTC
需要注意的是,Parse()方法返回的时间是UTC时间。如果需要转换成本地时间,可以使用time.Time的In()方法:
local := t.In(time.Local)
fmt.Println(local)
输出结果如下:
2021-07-14 01:13:16 +0800 CST
时间的运算
时间运算包括时间的加减和时间差的计算。
时间的加减
在Golang中,时间的加减可以通过time.Time的Add()和Sub()方法实现。Add()方法表示加上某个时间段,Sub()方法表示减去某个时间段。
例如将当前时间加上1个小时:
t := time.Now()
oneHourLater := t.Add(time.Hour)
fmt.Println(oneHourLater)
输出结果如下:
2021-07-13 18:26:22.5799832 +0800 CST m=+3601.000100601
例如将当前时间减去1个小时:
t := time.Now()
oneHourAgo := t.Add(-time.Hour)
fmt.Println(oneHourAgo)
输出结果如下:
2021-07-13 16:27:14.0249828 +0800 CST m=-3599.999802601
时间差的计算
时间差的计算可以使用Sub()方法,它会返回一个Duration类型的结果。
例如计算当前时间和1小时后的时间相差多长时间:
t := time.Now()
oneHourLater := t.Add(time.Hour)
duration := oneHourLater.Sub(t)
fmt.Println(duration)
输出结果如下:
1h0m0s
需要注意的是,在计算时间差时,两个时间点的时区应该相同,否则计算时间差的结果可能是不正确的。
常用时间操作
在实际开发中,涉及到时间处理的需求很多,下面介绍一些常用的时间操作。
获取时间戳
获取时间戳,即秒级别或纳秒级别的时间,可以使用time.Time类型的Unix()和UnixNano()方法。Unix()方法返回秒级别时间戳,UnixNano()方法返回纳秒级别时间戳。
例如获取当前时间的秒级别时间戳:
t := time.Now()
timestamp := t.Unix()
fmt.Println(timestamp)
输出结果如下:
1626184835
各时区时间间的转换
如果涉及到不同时区的时间,就需要进行时区转换。
在Golang中,可以使用time.LoadLocation()方法加载指定时区的地点信息,然后通过time.Time类型的In()方法将时间转换到指定时区。
例如将北京时间转换为纽约时间:
bj, _ := time.LoadLocation("Asia/Shanghai")
t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2021-07-13 17:13:16", bj)
ny, _ := time.LoadLocation("America/New_York")
tNY := t.In(ny)
fmt.Println(tNY)
输出结果如下:
2021-07-13 05:13:16 -0400 EDT
定时任务
在Golang中,可以使用time包提供的Ticker和Timer类型实现定时任务。
Ticker
Ticker类型表示每隔一段时间触发一次的定时器,它的定义如下:
type Ticker struct {
C <-chan Time // Ticker发送时间的通道
}
需要注意的是,Ticker只有在调用Stop()方法后才会停止发送时间。
例如每秒输出一次当前时间:
ticker := time.NewTicker(time.Second)
for t := range ticker.C {
fmt.Println(t)
}
Timer
Timer类型表示在指定时间后触发一次的定时器,它的定义如下:
type Timer struct {
C <-chan Time // Timer发送时间的通道
}
需要注意的是,Timer也可以通过Reset()方法重置定时器,它会取消之前的定时器并重新启动定时器。
例如5秒后输出当前时间:
timer := time.NewTimer(5 * time.Second)
<-timer.C
fmt.Println(time.Now())
结论
Golang中的时间处理非常灵活,可以通过time.Time和time.Duration类型实现各种时间相关的操作。本文介绍了时间的获取、格式化与解析、运算,以及常用时间操作等内容,希望对读者有所帮助。
极客笔记