Go語言中常用的日期與時間處理方法詳解
一、時間的基本獲取
Go 語言中的日期與時間處理主要通過標(biāo)準(zhǔn)庫 time 包實現(xiàn),它提供了豐富的時間獲取、計算、格式化、解析等功能,適用于定時任務(wù)、日志記錄、時間差計算等場景。
1.1 獲取當(dāng)前時間
使用 time.Now() 可以獲取當(dāng)前本地時間,返回 time.Time 類型。示例代碼:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("當(dāng)前時間:", now)
}
輸出:
當(dāng)前時間: 2025-09-09 15:07:56.123456 +0800 CST m=+0.000123456
詳細(xì)版本:
package main
import (
"fmt"
"time"
)
func main() {
// 獲取當(dāng)前時間
now := time.Now()
fmt.Println("當(dāng)前時間:", now)
// 獲取時間的各個部分
fmt.Println("年:", now.Year())
fmt.Println("月:", now.Month())
fmt.Println("日:", now.Day())
fmt.Println("時:", now.Hour())
fmt.Println("分:", now.Minute())
fmt.Println("秒:", now.Second())
fmt.Println("納秒:", now.Nanosecond())
fmt.Println("星期:", now.Weekday())
// 時間戳(自1970-01-01 00:00:00 UTC以來的秒數(shù))
fmt.Println("時間戳(秒):", now.Unix())
fmt.Println("時間戳(納秒):", now.UnixNano())
// 從時間戳創(chuàng)建時間
timestamp := now.Unix()
t := time.Unix(timestamp, 0)
fmt.Println("從時間戳恢復(fù)的時間:", t)
}
執(zhí)行結(jié)果如下:
當(dāng)前時間: 2025-09-25 19:26:41.588584 +0800 CST m=+0.000068543
年: 2025
月: September
日: 25
時: 19
分: 26
秒: 41
納秒: 588584000
星期: Thursday
時間戳(秒): 1758799601
時間戳(納秒): 1758799601588584000
從時間戳恢復(fù)的時間: 2025-09-25 19:26:41 +0800 CST
1.2 時間的格式化與解析
Go 語言使用特定的參考時間Mon Jan 2 15:04:05 MST 2006作為格式化模板。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
// 格式化時間
fmt.Println("標(biāo)準(zhǔn)格式:", now.Format(time.RFC3339))
fmt.Println("自定義格式1:", now.Format("2006-01-02 15:04:05"))
fmt.Println("自定義格式2:", now.Format("2006年01月02日 15時04分05秒"))
fmt.Println("簡短格式:", now.Format("06/01/02 15:04"))
// 解析字符串為時間
timeStr := "2023-10-05 14:30:00"
t, err := time.Parse("2006-01-02 15:04:05", timeStr)
if err != nil {
fmt.Println("解析錯誤:", err)
} else {
fmt.Println("解析后的時間:", t)
}
// 帶時區(qū)的解析
timeStr2 := "2023-10-05T14:30:00+08:00"
t2, err := time.Parse(time.RFC3339, timeStr2)
if err != nil {
fmt.Println("解析錯誤:", err)
} else {
fmt.Println("帶時區(qū)的時間:", t2)
}
}
執(zhí)行結(jié)果如下:
標(biāo)準(zhǔn)格式: 2025-09-25T19:28:00+08:00
自定義格式1: 2025-09-25 19:28:00
自定義格式2: 2025年09月25日 19時28分00秒
簡短格式: 25/09/25 19:28
解析后的時間: 2023-10-05 14:30:00 +0000 UTC
帶時區(qū)的時間: 2023-10-05 14:30:00 +0800 CST
二、時區(qū)處理
2.1 加載時區(qū)
使用 time.LoadLocation() 加載指定時區(qū)。示例代碼:
func main() {
loc, err := time.LoadLocation("America/New_York")
if err != nil {
fmt.Println("加載時區(qū)失敗:", err)
return
}
now := time.Now()
fmt.Println("本地時間:", now)
fmt.Println("紐約時間:", now.In(loc))
}
2.2 固定時區(qū)時間
使用 time.FixedZone() 創(chuàng)建固定偏移量的時區(qū)。示例代碼:
func main() {
loc := time.FixedZone("UTC+8", 8*3600)
now := time.Now()
fmt.Println("UTC+8 時間:", now.In(loc))
}
2.3 詳細(xì)版本代碼
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("本地時間:", now)
fmt.Println("UTC時間:", now.UTC())
// 加載特定時區(qū)
loc, err := time.LoadLocation("America/New_York")
if err != nil {
fmt.Println("加載時區(qū)錯誤:", err)
return
}
// 轉(zhuǎn)換到紐約時間
nyTime := now.In(loc)
fmt.Println("紐約時間:", nyTime.Format("2006-01-02 15:04:05"))
// 轉(zhuǎn)換到東京時間
loc, err = time.LoadLocation("Asia/Tokyo")
if err != nil {
fmt.Println("加載時區(qū)錯誤:", err)
return
}
tokyoTime := now.In(loc)
fmt.Println("東京時間:", tokyoTime.Format("2006-01-02 15:04:05"))
// 使用固定偏移創(chuàng)建時區(qū)(如UTC+8)
beijingLoc := time.FixedZone("CST", 8*3600)
beijingTime := now.In(beijingLoc)
fmt.Println("北京時間:", beijingTime.Format("2006-01-02 15:04:05"))
}
執(zhí)行結(jié)果如下:
本地時間: 2025-09-25 19:29:15.049073 +0800 CST m=+0.000072959
UTC時間: 2025-09-25 11:29:15.049073 +0000 UTC
紐約時間: 2025-09-25 07:29:15
東京時間: 2025-09-25 20:29:15
北京時間: 2025-09-25 19:29:15
三、時間計算與比較
3.1 時間加減
使用 Add() 和 AddDate() 方法進(jìn)行時間加減。示例代碼:
func main() {
now := time.Now()
fmt.Println("當(dāng)前時間:", now)
// 加 1 小時
later := now.Add(time.Hour)
fmt.Println("加 1 小時:", later)
// 加 1 天
tomorrow := now.AddDate(0, 0, 1)
fmt.Println("加 1 天:", tomorrow)
}
3.2 時間差計算
使用 Sub() 方法計算兩個時間之間的差值,返回 time.Duration 類型。示例代碼:
func main() {
start := time.Now()
time.Sleep(2 * time.Second)
end := time.Now()
duration := end.Sub(start)
fmt.Println("時間差:", duration)
fmt.Println("秒數(shù):", duration.Seconds())
}
綜合案例:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("當(dāng)前時間:", now.Format("2006-01-02 15:04:05"))
// 時間加法
tomorrow := now.Add(24 * time.Hour)
fmt.Println("明天此時:", tomorrow.Format("2006-01-02 15:04:05"))
nextWeek := now.AddDate(0, 0, 7)
fmt.Println("下周此時:", nextWeek.Format("2006-01-02 15:04:05"))
// 時間減法
lastHour := now.Add(-1 * time.Hour)
fmt.Println("一小時前:", lastHour.Format("2006-01-02 15:04:05"))
// 計算時間差
diff := now.Sub(lastHour)
fmt.Println("時間差:", diff.Hours(), "小時")
// 時間比較
if now.After(tomorrow) {
fmt.Println("now 在 tomorrow 之后")
} else {
fmt.Println("now 在 tomorrow 之前")
}
if now.Before(lastHour) {
fmt.Println("now 在 lastHour 之前")
} else {
fmt.Println("now 在 lastHour 之后")
}
// 檢查兩個時間是否相同
if now.Equal(now) {
fmt.Println("時間相同")
}
// 計算兩個日期之間的天數(shù)差
date1 := time.Date(2023, time.January, 1, 0, 0, 0, 0, time.UTC)
date2 := time.Date(2023, time.December, 31, 0, 0, 0, 0, time.UTC)
days := int(date2.Sub(date1).Hours() / 24)
fmt.Println("2023年天數(shù):", days)
}
執(zhí)行結(jié)果如下:
當(dāng)前時間: 2025-09-25 19:31:17
明天此時: 2025-09-26 19:31:17
下周此時: 2025-10-02 19:31:17
一小時前: 2025-09-25 18:31:17
時間差: 1 小時
now 在 tomorrow 之前
now 在 lastHour 之后
時間相同
2023年天數(shù): 364
四、定時器與 Ticker
package main
import (
"fmt"
"time"
)
func main() {
// 定時器: 延遲執(zhí)行一次
timer := time.NewTimer(2 * time.Second)
fmt.Println("等待2秒...")
<-timer.C
fmt.Println("2秒后執(zhí)行")
// 立即觸發(fā)定時器
timer2 := time.NewTimer(5 * time.Second)
go func() {
<-timer2.C
fmt.Println("timer2 觸發(fā)")
}()
stop2 := timer2.Stop()
if stop2 {
fmt.Println("timer2 已停止")
}
// Ticker: 周期性執(zhí)行
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
done := make(chan bool)
go func() {
time.Sleep(5 * time.Second)
done <- true
}()
fmt.Println("開始每秒輸出(持續(xù)5秒):")
for {
select {
case <-done:
fmt.Println("完成")
return
case t := <-ticker.C:
fmt.Println("當(dāng)前時間:", t.Format("15:04:05"))
}
}
}
執(zhí)行結(jié)果如下:
等待2秒...
2秒后執(zhí)行
timer2 已停止
開始每秒輸出(持續(xù)5秒):
當(dāng)前時間: 19:36:23
當(dāng)前時間: 19:36:24
當(dāng)前時間: 19:36:25
當(dāng)前時間: 19:36:26
當(dāng)前時間: 19:36:27
完成
五、實用時間工具函數(shù)
package main
import (
"fmt"
"time"
)
// 格式化時間為友好顯示(如: 3分鐘前, 2小時前, 3天前)
func TimeAgo(t time.Time) string {
now := time.Now()
diff := now.Sub(t)
switch {
case diff < time.Minute:
return fmt.Sprintf("%d秒前", int(diff.Seconds()))
case diff < time.Hour:
return fmt.Sprintf("%d分鐘前", int(diff.Minutes()))
case diff < 24*time.Hour:
return fmt.Sprintf("%d小時前", int(diff.Hours()))
case diff < 7*24*time.Hour:
return fmt.Sprintf("%d天前", int(diff.Hours()/24))
default:
return t.Format("2006-01-02")
}
}
// 獲取指定日期所在周的周一
func GetMondayOfWeek(t time.Time) time.Time {
weekday := t.Weekday()
offset := (int(weekday) - 1 + 7) % 7
return t.AddDate(0, 0, -offset)
}
// 獲取當(dāng)月第一天
func GetFirstDayOfMonth(t time.Time) time.Time {
return time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location())
}
// 獲取當(dāng)月最后一天
func GetLastDayOfMonth(t time.Time) time.Time {
return time.Date(t.Year(), t.Month()+1, 0, 0, 0, 0, 0, t.Location())
}
func main() {
// 測試TimeAgo函數(shù)
now := time.Now()
fmt.Println("剛剛:", TimeAgo(now))
fmt.Println("30秒前:", TimeAgo(now.Add(-30*time.Second)))
fmt.Println("2小時前:", TimeAgo(now.Add(-2*time.Hour)))
fmt.Println("3天前:", TimeAgo(now.Add(-3*24*time.Hour)))
// 測試周一周函數(shù)
monday := GetMondayOfWeek(now)
fmt.Println("本周一:", monday.Format("2006-01-02"))
// 測試月份第一天和最后一天
firstDay := GetFirstDayOfMonth(now)
lastDay := GetLastDayOfMonth(now)
fmt.Println("本月第一天:", firstDay.Format("2006-01-02"))
fmt.Println("本月最后一天:", lastDay.Format("2006-01-02"))
}
執(zhí)行結(jié)果如下:
剛剛: 0秒前
30秒前: 30秒前
2小時前: 2小時前
3天前: 3天前
本周一: 2025-09-22
本月第一天: 2025-09-01
本月最后一天: 2025-09-30
總結(jié):Go 語言的 time 包功能強(qiáng)大,支持時間的獲取、計算、格式化、解析、時區(qū)處理等操作。
到此這篇關(guān)于Go語言中常用的日期與時間處理方法詳解的文章就介紹到這了,更多相關(guān)Go時間處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 實現(xiàn)一個restful微服務(wù)的操作
這篇文章主要介紹了golang 實現(xiàn)一個restful微服務(wù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Go語言開發(fā)實現(xiàn)查詢IP信息的MCP服務(wù)器
隨著?MCP?的快速普及和廣泛應(yīng)用,MCP?服務(wù)器也層出不窮,本文將詳細(xì)介紹如何在?Go?語言中使用?go-mcp?庫來開發(fā)一個查詢?IP?信息的?MCP?服務(wù)器,有需要的小伙伴可以參考下2025-04-04
Golang 函數(shù)執(zhí)行時間統(tǒng)計裝飾器的一個實現(xiàn)詳解
這篇文章主要介紹了Golang 函數(shù)執(zhí)行時間統(tǒng)計裝飾器的一個實現(xiàn)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03

