العمل مع التواريخ في 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) هي نسخة من مكتبة Carbon الشهيرة في PHP للغة Go. توفر واجهة fluent سهلة الاستخدام للعمل مع التواريخ.
التثبيت
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("