Golang Time包入门
侧边栏壁纸
  • 累计撰写 11 篇文章
  • 累计收到 1 条评论

Golang Time包入门

tqtqtq
2026-02-06 / 0 评论 / 2 阅读 / 正在检测是否收录...

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.000000001

2. 时间的组成部分

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

评论 (0)

取消