العمل مع التواريخ والوقت في Go: من الأساسيات إلى التقنيات المتقدمة
تقدم لغة البرمجة Go (Golang) حزمة time قوية وبديهية للعمل مع التواريخ والوقت. على عكس العديد من اللغات الأخرى، تستخدم Go نهجًا فريدًا للتنسيق يعتمد على تاريخ مرجعي (Mon Jan 2 15:04:05 MST 2006). في هذه المقالة، سنشرح بالتفصيل جميع الجوانب الرئيسية: من إنشاء كائنات الوقت إلى العمل مع المؤقتات والمناطق الزمنية. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين ينتقلون إلى Go.
1. الأساسيات: إنشاء الوقت والحصول عليه وعرضه
النوع المركزي للعمل هو time.Time. يمكن الحصول على اللحظة الحالية باستخدام time.Now(). لإنشاء تاريخ محدد، يُستخدم time.Date().
package main
import ( "fmt" "time")
func main() { // الوقت الحالي now := time.Now() fmt.Println("الآن:", now)
// إنشاء تاريخ محدد (السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية، النانو ثانية، الموقع) specific := time.Date(2025, time.January, 15, 10, 30, 0, 0, time.UTC) fmt.Println("تاريخ محدد:", specific)
// استخراج المكونات 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.Weekday())}سيظهر مخرجات البرنامج الوقت الحالي ومكوناته. لاحظ: time.Now() يُرجع الوقت في المنطقة الزمنية المحلية للنظام.
2. التنسيق والتحليل: السمة المميزة لـ Go
في Go، لا يتم تنسيق التواريخ من خلال رموز مثل YYYY-MM-DD، بل من خلال تاريخ مرجعي: Mon Jan 2 15:04:05 MST 2006 (أو 01/02 03:04:05PM '06 -0700). تذكر هذه السلسلة السحرية - تبدو مثل 1 2 3 4 5 6 -7.
- 1 — الشهر (01, Jan, January)
- 2 — اليوم (02, 2)
- 3 — الساعة بتنسيق 12 ساعة (03, 3)
- 4 — الدقيقة (04, 4)
- 5 — الثانية (05, 5)
- 6 — السنة (06, 2006)
- -7 — المنطقة الزمنية (MST, -0700, -07:00)
التنسيق (Time → String)
now := time.Now()
// التنسيقات القياسيةfmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-01-15 10:30:45fmt.Println(now.Format("02.01.2006")) // 15.01.2025fmt.Println(now.Format(time.RFC3339)) // 2025-01-15T10:30:45Zfmt.Println(now.Format("Mon, 02 Jan 2006 15:04:05 MST")) // Wed, 15 Jan 2025 10:30:45 UTCالتحليل (String → Time)
// تحليل سلسلة نصية إلى time.TimedateStr := "2025-01-15 10:30:45"layout := "2006-01-02 15:04:05"parsedTime, err := time.Parse(layout, dateStr)if err != nil { panic(err)}fmt.Println("تم التحليل:", parsedTime)
// التحليل مع المنطقة الزمنيةdateWithZone := "2025-01-15T10:30:45+03:00"parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)fmt.Println("مع المنطقة:", parsedWithZone)إذا كنت بحاجة إلى تحليل تاريخ في منطقة زمنية معينة، استخدم time.ParseInLocation().
3. العمليات على التواريخ: Duration, Add, Sub والمقارنة
يمثل النوع time.Duration فترة زمنية. توفر Go الثوابت: Nanosecond, Microsecond, Millisecond, Second, Minute, Hour.
now := time.Now()
// إضافة وقتfuture := now.Add(72 * time.Hour) // +3 أيامfmt.Println("بعد 72 ساعة:", future)
// طرح وقتpast := now.Add(-30 * time.Minute) // قبل 30 دقيقةfmt.P