Like Share Discussion Bookmark Smile

J.J. Huang   2025-06-26   Getting Started Golang 07.套件   瀏覽次數:次   DMCA.com Protection Status

Go | 時間套件的函式與介紹

💬 簡介

時間處理是後端開發中極其常見的需求,無論是排程、記錄、計算時間差或格式化時間字串,time 套件都是 Go 語言中不可或缺的一環。

本篇將透過實際範例,介紹 time 套件中常見的時間操作函式,包括「取得現在時間」、「格式化與解析」、「時間加減與比較」等主題,幫助你靈活運用這組功能齊全的標準套件。

圖片來源:Gophers


🕒 時間取得與基本使用

1
2
3
4
5
6
7
8
now := time.Now()
fmt.Println("年:", now.Year()) // 現在時間: 2025-06-26 09:30:36.1111677 +0800 CST m=+0.000000001
fmt.Println("現在時間:", now) // 年: 2025
fmt.Println("月:", now.Month()) // 月: June
fmt.Println("日:", now.Day()) // 日: 26
fmt.Println("小時:", now.Hour()) // 小時: 9
fmt.Println("分鐘:", now.Minute()) // 分鐘: 30
fmt.Println("秒:", now.Second()) // 秒: 36

🧭 區域時區與 UTC 時間

1
2
3
now := time.Now()
fmt.Println("當地時間:", now) // 當地時間: 2025-06-26 09:32:35.7068147 +0800 CST m=+0.000000001
fmt.Println("UTC 時間:", now.UTC()) // UTC 時間: 2025-06-26 01:32:35.7068147 +0000 UTC

🧾 時間格式化與解析

⚙️ 格式化(Format)

Go 使用特殊方式來定義時間格式範本:

1
Mon Jan 2 15:04:05 MST 2006

你必須以這個具體時間來定義輸出格式。

1
2
3
4
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-06-26 09:33:07
fmt.Println(now.Format("2006/01/02")) // 2025/06/26
fmt.Println(now.Format("15:04")) // 09:33

📐 解析(Parse)

將字串轉為 time.Time 型別:

1
2
3
4
5
6
layout := "2006-01-02 15:04:05"
t, err := time.Parse(layout, "2025-06-20 08:30:00")
if err != nil {
log.Fatal(err)
}
fmt.Println("解析結果:", t) // 解析結果: 2025-06-20 08:30:00 +0000 UTC

📝 注意:格式必須與 layout 完全對應,否則解析會失敗。


➕ 時間加減與比較

⏱ 時間加減(Add/Sub)

1
2
3
4
5
now := time.Now()
plus := now.Add(2 * time.Hour) // 加兩小時
minus := now.Add(-30 * time.Minute) // 減半小時
fmt.Println("2小時後:", plus) // 2小時後: 2025-06-26 11:34:58.6331843 +0800 CST m=+7200.000000001
fmt.Println("30分鐘前:", minus) // 30分鐘前: 2025-06-26 09:04:58.6331843 +0800 CST m=-1799.999999999

⌛ 計算時間差(Duration)

1
2
3
4
5
6
7
start := time.Now()
time.Sleep(2 * time.Second)
end := time.Now()

diff := end.Sub(start)
fmt.Println("經過時間:", diff) // 經過時間: 2.0007479s
fmt.Println("秒數:", diff.Seconds()) // 秒數: 2.0007479

🔍 時間比較(Before/After/Equal)

1
2
3
4
5
6
t1 := time.Now()
t2 := t1.Add(10 * time.Second)

fmt.Println(t1.Before(t2)) // true
fmt.Println(t2.After(t1)) // true
fmt.Println(t1.Equal(t1)) // true

📌 實務應用場景

  • ✅ 記錄使用者登入時間、訂單建立時間
  • ✅ 計算某事件距今多久(時間差)
  • ✅ 排程任務:定時執行工作(與 ticker、sleep 配合)
  • ✅ 格式化為前端可閱讀的時間格式
  • ✅ 處理跨時區時間轉換與顯示

🧰 延伸技巧與補充

  • 使用 time.Unix() / UnixNano() 處理 timestamp:

    1
    2
    ts := time.Now().Unix()
    fmt.Println("Unix 秒數:", ts)
  • 建立固定時間:

    1
    2
    custom := time.Date(2025, 6, 20, 12, 0, 0, 0, time.Local)
    fmt.Println("自訂時間:", custom)
  • 時區轉換:

    1
    2
    3
    loc, _ := time.LoadLocation("Asia/Taipei")
    tInLoc := time.Now().In(loc)
    fmt.Println("台北時間:", tInLoc)

🎯 總結

time 套件是 Go 語言中處理時間與日期的核心:

  • ✅ 支援時間的取得、格式化與解析
  • ✅ 可進行時間加減與時間差計算
  • ✅ 適合與 sleep、ticker、cron 類套件結合使用

建議平時多熟悉 Format 的範本用法,並留意時區與格式一致性問題。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go