Golang Time包入门
一、基础概念
Time 包主要用于处理时间相关的操作,比如获取当前时间、时间计算、格式化等。
1.获取当前时间
package main
import (
"fmt"
"time"
)
func main() {
// 获取当前时间
now := time.Now()
fmt.Println("现在是:", now)
}
//输出:
//现在是: 2026-02-05 22:19:18.4958836 +0800 CST m=+0.0000000012. 时间的组成部分
now := time.Now()
fmt.Println("年:", now.Year())
fmt.Println("月:", now.Month()) // 英文月份
fmt.Println("月:", int(now.Month())) // 数字月份
fmt.Println("日:", now.Day())
fmt.Println("时:", now.Hour())
fmt.Println("分:", now.Minute())
fmt.Println("秒:", now.Second())
fmt.Println("星期:", now.Weekday())
//输出:
//年: 2026
//月: February
//月: 2
//日: 5
//时: 22
//分: 20
//秒: 25
//星期: Thursday二、时间格式化
Golang 的时间格式化比较特殊,使用 2006-01-02 15:04:05 这个固定时间作为模板。
now := time.Now()
// 常用格式
fmt.Println(now.Format("2006-01-02")) // 2024-02-05
fmt.Println(now.Format("2006-01-02 15:04:05")) // 2024-02-05 14:30:25
fmt.Println(now.Format("15:04:05")) // 14:30:25
fmt.Println(now.Format("2006/01/02")) // 2024/02/05
fmt.Println(now.Format("01-02-2006")) // 02-05-2024
//输出:
//2026-02-05
//2026-02-05 22:22:57
//22:22:57
//2026/02/05
//02-05-2026三、时间间隔 Duration
Go 语言不使用整数(int)直接代表秒或毫秒,而是用 time.Duration 类型。Duration 表示两个时间点之间的间隔,常用于延时、超时等场景。
// 常用的时间单位
fmt.Println(time.Second) // 1秒
fmt.Println(time.Minute) // 1分钟
fmt.Println(time.Hour) // 1小时
// 自定义时间间隔
d := 3 * time.Second // 3秒
d2 := 500 * time.Millisecond // 500毫秒
d3 := 2 * time.Hour // 2小时
//如果有一个变量 n := 5,想休眠 n 秒,不能写 n * time.Second,必须强转:time.Duration(n) * time.Second四、常用操作
1. 时间睡眠(暂停程序)
fmt.Println("开始")
time.Sleep(2 * time.Second) // 暂停2秒
fmt.Println("2秒后")2. 时间加减
now := time.Now()
// 加时间
future := now.Add(24 * time.Hour) // 加1天
fmt.Println("明天:", future)
past := now.Add(-1 * time.Hour) // 减1小时
fmt.Println("1小时前:", past)
// 加日期
nextMonth := now.AddDate(0, 1, 0) // 加1个月
fmt.Println("下个月:", nextMonth)
nextYear := now.AddDate(1, 0, 0) // 加1年
yesterday := now.AddDate(0, 0, -1) // 减1天3. 时间比较
t1 := time.Now()
time.Sleep(1 * time.Second)
t2 := time.Now()
// 判断时间先后
if t2.After(t1) {
fmt.Println("t2 在 t1 之后")
}
if t1.Before(t2) {
fmt.Println("t1 在 t2 之前")
}
// 计算时间差
diff := t2.Sub(t1)
fmt.Println("相差:", diff)五、多线程中常用的 Time 操作
1. 定时器 Timer(执行一次)
// 3秒后执行
timer := time.NewTimer(3 * time.Second)
go func() {
<-timer.C // 等待定时器触发
fmt.Println("定时器触发了!")
}()
time.Sleep(5 * time.Second) // 主程序等待2. 周期执行 Ticker
// 每隔1秒执行一次
ticker := time.NewTicker(1 * time.Second)
go func() {
for t := range ticker.C {
fmt.Println("滴答:", t.Format("15:04:05"))
}
}()
time.Sleep(5 * time.Second)
ticker.Stop() // 停止定时器3. 超时控制
// 方法1:使用 time.After
select {
case <-time.After(3 * time.Second):
fmt.Println("超时了!")
case result := <-someChannel:
fmt.Println("收到结果:", result)
}
// 方法2:使用 context(更推荐)
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
select {
case <-ctx.Done():
fmt.Println("超时:", ctx.Err())
}
评论 (0)