golang 每日一庫之 jinzhu-now

jinzhu/now 是一個用於增強 Go 語言時間處理的第三方庫,它基於標準庫 time 進行了擴展,提供了更便捷的時間操作功能,適用於需要頻繁處理時間區間、時區轉換或複雜時間解析的場景。

以下是該庫的核心功能和用法詳解:

一、核心功能

  1. 時間區間的便捷計算now 庫提供了快速獲取時間區間(如某分鐘的開始 / 結束、某周的開始 / 結束等)的方法,無需手動計算。例如:

    import "github.com/jinzhu/now"
    t := time.Now()
    startOfDay := now.With(t).BeginningOfDay()    // 當天零點
    endOfMonth := now.With(t).EndOfMonth()        // 當月最後一天的23:59:59.999999999

    支持的時間區間包括分鐘、小時、天、周、月、季度、年等,且可自定義周起始日(默認週日)。

  2. 時區支持通過 time.Location 或 now.With(t).In(loc) 方法,輕鬆處理不同時區的時間。例如:

    beijing := time.FixedZone("Beijing Time", 8*3600)  // 東八區
    tInBeijing := now.With(time.Now()).In(beijing)      // 轉換爲北京時間
  3. 時間解析優化簡化了字符串到時間的解析過程,支持多種日期格式自動識別,無需嚴格指定模板。例如:

    t1, _ := now.Parse("2023-10-05")          // 自動識別日期格式
    t2, _ := now.Parse("2023/10/05 14:30")    // 支持帶時間的字符串

    相比標準庫 time.Parse 需要固定模板的繁瑣,now 更靈活。

  4. 時間運算與格式化
    支持時間加減(如 AddSub)及格式化輸出,兼容 time.Time 的所有方法,擴展性強。

二、典型使用場景

  1. 報表生成需要按日、周、月統計時,快速獲取時間區間邊界。例如生成某月訂單彙總:

    start := now.With(t).BeginningOfMonth()
    end := now.With(t).EndOfMonth()
    db.Where("created_at BETWEEN ? AND ?", start, end).Find(&orders)
  2. 日誌處理解析不同格式的日誌時間戳,統一轉換爲標準時間:

    logTime, _ := now.Parse("2023-10-05T15:04:05Z07:00")
  3. 國際化時區適配
    處理多時區用戶的時間顯示:

    userTime := now.ParseInLocation("2006-01-02 15:04""2023-10-05 14:30", userLocation)

三、安裝與使用示例

  1. 安裝通過 Go Modules 安裝:

    go get github.com/jinzhu/now
  2. 基礎示例

    package main
    import (
        "fmt"
        "github.com/jinzhu/now"
        "time"
    )
    func main() {
        // 獲取當前時間的周開始和結束(可自定義周起始日)
        now.WeekStartDay = time.Monday
        weekStart := now.BeginningOfWeek()
        weekEnd := now.EndOfWeek()
        fmt.Printf("本週範圍: %v 至 %v\n", weekStart, weekEnd)
        // 解析多種格式的時間字符串
        t, _ := now.Parse("2023-10-05 14:30")
        fmt.Println("解析時間:", t)
    }
    

四、注意事項

五、參考文檔

標題:golang 每日一庫之 jinzhu/now
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/12/1741780652960.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/HM56t5ibSqBOJRiRHqMzkA