Skip to main content

日期时间处理

在go语言的标准库里,可以通过time来处理日期和时间。我们需要引用标准库

import "time"

1. 获取当前时间

now := time.Now()
fmt.Println(now)
// 当前时间戳,1970年1月1日到现在的秒数
fmt.Println(" 秒", now.Unix())
fmt.Println("豪秒", now.UnixMilli())
fmt.Println("微秒", now.UnixMicro())
fmt.Println("纳秒", now.UnixNano())

输出

2023-04-13 13:10:17.8577739 +0800 CST m=+0.004403301
秒 1681362617
豪秒 1681362617857
微秒 1681362617857773
纳秒 1681362617857773900

time.Now 返回的结构是 time.Time

type Time struct {
wall uint64
ext int64
loc *Location
}

按go的约定,这个结构里的数据都是私有变量,对于我们使用来说没有价值。

2. 日期时间格式化

特别注意:go的格式化字符串不是常见的 yy-MM-dd HH:mm:ss,而是2006-01-02 15:04:05 Go的成立日期。

fmt.Println(now.Format("2006-01-02 15:04:05"))
fmt.Println(now.Format("06-1-2 3:4:5"))

输出

2023-04-13 14:21:21
23-4-13 2:21:21

格式化字符说明:

字符说明
1月份
01月份,保证两位数字,1月会输出01
2日期
02日期,保证两位数字,2日会输出02
3小时,12小时制
03小时,保证两位数字,3时会输出03
15小时,24小时制,保证两位数字,3时会输出03
4分钟
04分钟,保证两位数字,4分会输出04
5
05秒,保证两位数字,5秒会输出05
06年,输出最后两位
2006年,输出4位
.000毫秒

可以快速记忆: 1月2日3时4分5秒6年

3. 字符串日期时间转time

通过time.Parse来把字符串转为 Time 时间对象

t, err := time.Parse("2006-01-02 15:04:05", "2023-04-14 07:03:04")
if err == nil {
fmt.Print(t.Year())
} else {
fmt.Print(err)
}

输出: 2023

如果出错了,会在返回的err 里有说明。比如:

t, err := time.Parse("2006-01-02 15:04:05", "04-14 07:03:04")
if err == nil {
fmt.Print(t.Year())
} else {
fmt.Print(err)
}

就会输出

parsing time "04-14 07:03:04" as "2006-01-02 15:04:05": cannot parse "04-14 07:03:04" as "2006"

4. 获取年/月/周/日/时/分/秒

t, err := time.Parse("2006-01-02 15:04:05", "04-14 07:03:04")

fmt.Println("年", t.Year())
fmt.Println("月", t.Month())
fmt.Println("月", t.Month() == 4)
fmt.Println("日", t.Day())
fmt.Println("时", t.Hour())
fmt.Println("分", t.Minute())
fmt.Println("秒", t.Second())
fmt.Println("星期几", t.Weekday())
year, week := t.ISOWeek()
fmt.Println("某年第几周", year, week)
fmt.Println("当年第几天", t.YearDay())

输出

年 2023
月 April
月 true
日 14
时 7
分 3
秒 4
星期几 Friday
某年第几周 2023 15
当年第几天 104

时间加减

我们可以通过AddDate方法来进行日期的加减。 AddDate定义如下:

func (t Time) AddDate(years int, months int, days int) Time 

下面是示例代码

now := time.Now()
t1 := now.AddDate(0, 0, -2) // 前两天
t2 := now.AddDate(0, 0, 2) // 后两天
t3 := now.AddDate(0, -2, 0) // 前两月
t4 := now.AddDate(0, 2, 0) // 后两月

如果时间段比较秙,则使用 Add 方法,

now := time.Now()
d, _ := time.ParseDuration("-1m")
t1 := now.Add(d) // 前一分钟

d2, _ := time.ParseDuration("1m")
t2 := now.Add(d2) // 后一分钟

ParseDuration 里可以使用的单位包括: "ms", "s", "m", "h"分别对应 微秒,秒,分,时