Go (Golang) 中的日期处理:库概览
在任何编程语言中,日期和时间的处理都是一项关键任务。在 Go (Golang) 中,标准库提供了强大的 time 包,但有时为了方便,开发者会使用第三方库。本文将介绍标准包的主要功能,并探讨两个流行的库:carbon 和 now。
1. 标准 time 包
time 包是 Go 中处理日期的基础。它包含 Time、Duration 类型,以及用于解析、格式化、处理定时器和时区的函数。
创建和格式化日期
package main
import ( "fmt" "time")
func main() { // 当前时间 now := time.Now() fmt.Println("当前时间:", now)
// 创建特定日期 date := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC) fmt.Println("特定日期:", date)
// 格式化(必须使用 "2006-01-02 15:04:05" 作为参考格式) fmt.Println("格式化:", date.Format("02.01.2006 15:04:05"))}将字符串解析为日期
func main() { // 指定格式进行解析 str := "2025-03-15 14:30:00" parsed, err := time.Parse("2006-01-02 15:04:05", str) if err != nil { panic(err) } fmt.Println("解析结果:", parsed)}处理时区
func main() { loc, _ := time.LoadLocation("Europe/Moscow") moscowTime := time.Now().In(loc) fmt.Println("莫斯科时间:", moscowTime)}日期之间的差异
func main() { start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC) end := time.Date(2025, 12, 31, 23, 59, 59, 0, time.UTC) duration := end.Sub(start) fmt.Printf("差异: %v (小时: %v)", duration, duration.Hours())}2. carbon 库
carbon 库 (github.com/golang-module/carbon) 是流行的 PHP Carbon 库在 Go 中的移植版本。它提供了便捷的流畅接口用于日期处理。
安装
go get github.com/golang-module/carbon/v2使用示例
package main
import ( "fmt" "github.com/golang-module/carbon/v2")
func main() { // 当前日期 now := carbon.Now() fmt.Println("当前时间:", now.ToString())
// 创建日期 date := carbon.Parse("2025-03-15 14:30:00") fmt.Println("解析结果:", date.ToDateString())
// 添加天数 future := carbon.Now().AddDays(10) fmt.Println("10天后:", future.ToDateString())
// 天数差异 diff := carbon.Now().DiffInDays(carbon.Parse("2025-12-31")) fmt.Printf("距离新年还有: %d 天", diff)
// 格式化 fmt.Println("自定义格式:", carbon.Now().Format("d/m/Y H:i:s"))}便捷方法
StartOfDay()/EndOfDay()— 一天的开始/结束IsWeekend()/IsWeekday()— 检查星期几Age()— 从出生日期算起的年龄DiffForHumans()— 人类可读的差异(例如 "3 天前")
3. now 库
now 库 (github.com/jinzhu/now) 由 GORM 的作者创建,是一个轻量级的工具,用于获取时间段的开始和结束。
安装
go get github.com/jinzhu/now使用示例
package main
import ( "fmt" "time" "github.com/jinzhu/now")
func main() { // 一天的开始 beginningOfDay := now.BeginningOfDay() fmt.Println("