Time
time 包中对 Time 的定义:
type Time struct {
// wall:表示距离公元 1 年 1 月 1 日 00:00:00UTC 的秒数;
wall uint64
// ext:表示纳秒;
ext int64
// loc:代表时区,主要处理偏移量,不同的时区,对应的时间不一样。
loc *Location
}
时间的获取
now
now := time.Now() //返回当前时间的Time
fmt.Printf("current time:%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)
// log
current time:2019-12-12 12:33:19.4712277 +0800 CST m=+0.006980401
2019-12-12 12:33:19
unix
时间戳是自 1970 年 1 月 1 日(08:00:00GMT)至当前时间的总毫秒数,它也被称为 Unix 时间戳(UnixTimestamp)。
now := time.Now() //获取当前时间
timestamp10 := now.Unix() //秒时间戳(10位)
timestamp13 := now.UnixNano() / 1e6 //毫秒时间戳(13位)
unix to Time
使用 time.Unix() 函数可以将时间戳转为时间格式。
func main() {
now := time.Now() //获取当前时间
timestamp := now.Unix() //时间戳
timeObj := time.Unix(timestamp, 0) //将时间戳转为时间格式
fmt.Println(timeObj)
year := timeObj.Year() //年
month := timeObj.Month() //月
day := timeObj.Day() //日
hour := timeObj.Hour() //小时
minute := timeObj.Minute() //分钟
second := timeObj.Second() //秒
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
// log
2019-12-12 13:24:09 +0800 CST
2019-12-12 13:24:09
解析
Format
Time 类型有一个自带的 Format 方法进行格式化。
需要注意的是Go语言中格式化时间模板不是常见的
Y-m-d H:M:S
而是使用Go语言的诞生时间 2006 年 1 月 2 号 15 点 04 分 05 秒。
func main() {
now := time.Now()
// 24小时制
fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
fmt.Println(now.Format("2006-01-02 15:04:05"))
// 12小时制
fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
fmt.Println(now.Format("2006/01/02 15:04"))
fmt.Println(now.Format("15:04 2006/01/02"))
fmt.Println(now.Format("2006/01/02"))
}
// log
2019-12-12 15:20:52.037 Thu Dec
2019-12-12 15:20:52
2019-12-12 03:20:52.037 PM Thu Dec
2019/12/12 15:20
15:20 2019/12/12
2019/12/12
Parse
解析一个格式化的时间字符串并返回它代表的时间
func Parse(layout, value string) (Time, error)
func ParseInLocation(layout, value string, loc *Location) (Time, error)
ParseInLocation 与 Parse 函数类似,但有两个重要的不同之处:
- 当缺少时区信息时,Parse 将时间解释为 UTC 时间,而 ParseInLocation 将返回值的 Location 设置为 loc。
- 第二,当时间字符串提供了时区偏移量信息时,Parse 会尝试去匹配本地时区,而 ParseInLocation 会去匹配 loc。
func main() {
var layout string = "2006-01-02 15:04:05"
var timeStr string = "2019-12-12 15:22:12"
timeObj1, _ := time.Parse(layout, timeStr)
fmt.Println(timeObj1)
timeObj2, _ := time.ParseInLocation(layout, timeStr, time.Local)
fmt.Println(timeObj2)
}
// log
2019-12-12 15:22:12 +0000 UTC
2019-12-12 15:22:12 +0800 CST
操作函数
Add
某个时间 + 时间间隔
func (t Time) Add(d Duration) Time
Sub
返回一个 t - u 的时间差值。
如果结果超出了 Duration 可以表示的最大值或最小值,将返回最大值或最小值。
要获取时间点 t - d(d 为 Duration),可以使用 t.Add(-d)
func (t Time) Sub(u Time) Duration
Equal
判断两个时间是否相同。
该函数会考虑时区的影响,因此不同时区标准的时间也可以正确比较,Equal 方法和用 t==u 不同,Equal 方法还会比较地点和时区信息。
func (t Time) Equal(u Time) bool
Before
判断一个时间点是否在另一个时间点之前:如果 t 代表的时间点在 u 之前,则返回真,否则返回假。
func (t Time) Before(u Time) bool
After
判断一个时间点是否在另一个时间点之后:如果 t 代表的时间点在 u 之后,则返回真,否则返回假。
func (t Time) After(u Time) bool