العمل مع التواريخ في Go (Golang): المكتبات والأدوات
تقدم لغة Go (Golang) مكتبة قياسية قوية time تغطي معظم مهام العمل مع التواريخ والأوقات. ومع ذلك، بالنسبة للعمليات المعقدة مثل تحليل التنسيقات غير القياسية، أو العمل مع التواريخ النسبية، أو الحسابات باستخدام التقويمات التجارية، أنشأ المجتمع عددًا من المكتبات المفيدة. في هذه المقالة، سنستعرض الإمكانيات المضمنة في Go بالإضافة إلى أفضل الحزم الخارجية للعمل مع التواريخ.
1. المكتبة المضمنة time
المكتبة القياسية time هي الأساس لأي عمليات مع التواريخ في Go. توفر:
- الأنواع
TimeوDurationوLocation - دوال للحصول على الوقت الحالي، وإنشاء التواريخ، والتحليل والتنسيق
- دعم المناطق الزمنية والساعات الأحادية (monotonic clocks)
الحصول على الوقت الحالي
package main
import ( "fmt" "time")
func main() { now := time.Now() fmt.Println("الوقت الحالي:", now) fmt.Println("السنة:", now.Year()) fmt.Println("الشهر:", now.Month()) fmt.Println("اليوم:", now.Day())}تنسيق التواريخ
في Go، يُستخدم تنسيق مرجعي خاص: Mon Jan 2 15:04:05 MST 2006 (الأرقام 1,2,3,4,5,6 بترتيب تصاعدي).
now := time.Now()fmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-03-15 14:30:00fmt.Println(now.Format("02 Jan 2006")) // 15 Mar 2025fmt.Println(now.Format(time.RFC3339)) // 2025-03-15T14:30:00Zتحليل السلاسل النصية
dateStr := "2025-03-15 14:30:00"t, err := time.Parse("2006-01-02 15:04:05", dateStr)if err != nil { panic(err)}fmt.Println(t) // 2025-03-15 14:30:00 +0000 UTCالعمل مع المناطق الزمنية
loc, _ := time.LoadLocation("Europe/Moscow")moscowTime := time.Now().In(loc)fmt.Println("توقيت موسكو:", moscowTime.Format("15:04:05"))2. مكتبة carbon
الحزمة github.com/golang-module/carbon هي نظير Go لمكتبة Carbon الشهيرة في PHP. توفر واجهة برمجة تطبيقات (API) مريحة للعمل مع التواريخ، بما في ذلك التواريخ النسبية والتنسيقات القابلة للقراءة البشرية والاستدعاءات المتسلسلة.
التثبيت
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.ToDateString()) // 2025-03-15
// التواريخ النسبية fmt.Println(now.AddDays(7).ToDateString()) // 2025-03-22 fmt.Println(now.SubMonths(1).ToDateString()) // 2025-02-15 fmt.Println(now.StartOfMonth().ToDateString()) // 2025-03-01 fmt.Println(now.EndOfMonth().ToDateString()) // 2025-03-31
// التنسيقات القابلة للقراءة البشرية fmt.Println(now.DiffForHumans()) // 刚刚 (الآن فقط)
// التحليل مع دعم تنسيقات متعددة t := carbon.Parse("2025-03-15 14:30:00") fmt.Println(t.ToDateTimeString()) // 2025-03-15 14:30:00
// العمل مع المناطق الزمنية cst := carbon.Now(carbon.NewYork) fmt.Println(cst.ToDateTimeString()) // الوقت في نيويورك}3. مكتبة now
الحزمة github.com/jinzhu/now (من مؤلف GORM) توفر دوال مريحة للحصول على بداية ونهاية الفترات الزمنية.
التثبيت
go get github.com/jinzhu/nowأمثلة
package main
import ( "fmt" "github.com/jinzhu/now" "time")
func main() { t := time.Now() fmt.Println(now.BeginningOfMonth(t)) // 2025-03-01 00:00:00 fmt.Println(now.EndOfMonth(t)) // 2025-03-31 23:59:59 fmt.Println(now.BeginningOfYear(t))