go标准库之time模块

163 阅读3分钟

time 提供测量和显示时间的功能

基本使用

func main() {
	now := time.Now()
	fmt.Printf("now: %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)
	fmt.Printf("%T,%T,%T %T,%T,%T\n", year, month, day, hour, minute, second)
}

/*
2022-12-21 10:22:03
int,time.Month,int int,int,int
*/

时间戳

时间戳多应用与 Web 开发中的 cookies 有效期,接口加密, Redis 中的 key 有效期等

时间戳是 1970年1月1日08:00:00GTM )至今的总毫秒数,也称为 Unix 时间戳

func main() {
	now := time.Now()
	fmt.Printf("now.Unix(): %T\n", now.Unix()) // now.Unix(): int64
	fmt.Printf("now.Unix(): %v\n", now.Unix()) // now.Unix(): 1671589570
}

获取纳秒时间戳

fmt.Printf("now.UnixNano(): %v\n", now.UnixNano())

时间戳转为普通的时间格式

可以通过 time.Unix 将时间戳转为当前时间格式

func timeStampToTime() {
	timestamp := time.Now().Unix()
	timeObj := time.Unix(timestamp, 0)   // 将时间戳转为时间格式
	fmt.Printf("timeObj: %v\n", timeObj) // timeObj: 2022-12-21 10:31:04 +0800 CST
	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) 
	// 2022-12-21 10:31:04
}

操作时间

Add

  • 只能加时分秒
// 输出纳秒时间戳
func add(h, m, s, mls, msc, ns time.Duration) {
	now := time.Now()
	fmt.Println(now.Add(time.Hour*h + time.Minute*m + time.Second*s + time.Millisecond*mls + time.Microsecond*msc + time.Nanosecond*ns))
}
const (
	Nanosecond  Duration = 1
	Microsecond          = 1000 * Nanosecond
	Millisecond          = 1000 * Microsecond
	Second               = 1000 * Millisecond
	Minute               = 60 * Second
	Hour                 = 60 * Minute
)

Sub

func sub() {
	now := time.Now()
	// 在原来的时间上加1小时
	targetTime := now.Add(time.Hour)
	// 目标时间与此时相比差1h0m0s
	fmt.Printf("targetTime.Sub(now): %v\n", targetTime.Sub(now))
}

Equal

判断时间是否相等,不同时区也可以正确比较

func (t Time) Equal(u Time) bool

Before

如果 t 的时间点在 u 之前,返回 true

func (t Time) Before(u Time) bool

After

如果 t 的时间点在 u 之后,返回 true

func (t Time) After(u Time) bool

定时器

使用 time.Tick(时间间隔) 来设置定时器,定时器本质是一个通道 channel

func tick() {
	ticker := time.Tick(time.Second) // 定义一个1s间隔的定时器
	for i := range ticker {
		fmt.Printf("i: %v\n", i)
	}
}

时间格式化

时间类型自带方法 Format 进行格式化, go 语言中格式化时间模板不是常见的 Y-m-d H:M:S ,而是 go 诞生的时间2006年1月2号15点04分 ( 2006 1 2 3 4 )

func test() {
	t := time.Now()
	fmt.Println(t.Format("2006/01/02 15:04"))    // 2022/12/21 10:54
	fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-12-21 10:54:09
	fmt.Println(t.Format("15:04 2006/01/02"))    // 10:55 2022/12/21
}

解析字符串格式的时间

func main() {
	now := time.Now()
	// 加载时区
	loc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}

	// 按照指定时区指定格式解析字符串时间
	timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/12/21 10:15:20", loc)
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	fmt.Printf("timeObj: %v\n", timeObj)                // timeObj: 2022-12-21 10:15:20 +0800 CST
	fmt.Printf("timeObj.Sub(): %v\n", timeObj.Sub(now)) // timeObj.Sub(): -44m1.3048818s
}