العمل مع التواريخ والوقت في Go: من الأساسيات إلى التقنيات المتقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في العمل مع التواريخ والوقت في Go

\n

العمل مع التواريخ والوقت هو إحدى المهام الأساسية في أي تطبيق جاد. سواء كان ذلك تسجيل الأحداث، حساب المهلات الزمنية، العمل مع الجداول الزمنية أو تحليل السلاسل الزمنية، توفر لغة Go مجموعة أدوات قوية وأنيقة في الحزمة القياسية time. في هذه المقالة، سنشرح العمل مع التواريخ والوقت في Go من الألف إلى الياء: من إنشاء كائنات الوقت إلى العمليات المعقدة مع المناطق الزمنية والمؤقتات.

\n\n

الأساسيات: بنية time.Time وإنشاء التواريخ

\n

العنصر المركزي في حزمة time هو البنية time.Time. وهي تمثل لحظة زمنية بدقة نانوثانية ومعلومات عن المنطقة الزمنية.

\n\n

الحصول على الوقت الحالي

\n

السيناريو الأكثر شيوعاً هو الحصول على اللحظة الحالية:

\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\nfunc main() {\n    now := time.Now()\n    fmt.Println("الوقت الحالي:", now)\n}
\n\n

إنشاء تاريخ محدد

\n

لإنشاء تاريخ، تُستخدم الدالة time.Date(). لاحظ: في Go، يتم تحديد الأشهر باستخدام الثوابت (time.January، time.February، إلخ) أو برقم من 1 إلى 12.

\n
func main() {\n    // 15 مارس 2025، الساعة 14:30:00، UTC\n    specificDate := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC)\n    fmt.Println("تاريخ محدد:", specificDate)\n    \n    // إنشاء مع نانوثوانٍ\n    preciseDate := time.Date(2025, 3, 15, 14, 30, 0, 123456789, time.UTC)\n    fmt.Println("تاريخ دقيق:", preciseDate)\n}
\n\n

تنسيق وتحليل التواريخ

\n

في Go، يُستخدم نهج فريد للتنسيق: بدلاً من الرموز مثل %Y-%m-%d، تستخدم الوقت المرجعي Mon Jan 2 15:04:05 MST 2006 (الذي يُقرأ كـ 01 02 03 04 05 06 07 — السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية، السنة).

\n\n

التنسيق (time ← سلسلة نصية)

\n

تقوم طريقة Format() بتحويل الوقت إلى سلسلة نصية وفقاً للنمط المحدد:

\n
func main() {\n    now := time.Now()\n    \n    // التنسيقات القياسية\n    fmt.Println("RFC3339:", now.Format(time.RFC3339))\n    fmt.Println("التاريخ:", now.Format("2006-01-02"))\n    fmt.Println("الوقت:", now.Format("15:04:05"))\n    fmt.Println("تنسيق كامل:", now.Format("02.01.2006 15:04:05"))\n    fmt.Println("مع يوم الأسبوع:", now.Format("Mon, 02 Jan 2006"))\n}
\n\n

التحليل (سلسلة نصية ← time.Time)

\n

تقوم الدالة time.Parse() بتحليل سلسلة نصية إلى بنية وقت. مهم: يجب أن يتطابق النمط تماماً مع تنسيق السلسلة النصية المدخلة.

\n
func main() {\n    // تحليل بتنسيق معروف\n    dateStr := "2025-03-15 14:30:00"\n    parsed, err := time.Parse("2006-01-02 15:04:05", dateStr)\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println("تم التحليل:", parsed)\n    \n    // تحليل مع منطقة زمنية\n    dateWithZone := "2025-03-15T14:30:00+03:00"\n    parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)\n    fmt.Println("مع منطقة زمنية:", parsedWithZone)\n}
\n\n

حسابات الوقت: الفترات والمقارنات

\n

توفر حزمة time النوع Duration لتمثيل الفترات الزمنية وطرقاً للعمليات الحسابية.

\n\n

الجمع والطرح

\n
func main() {\n    now := time.Now()\n    \n    // إضافة ساعتين و30 دقيقة\n    future := now.Add(2*time.Hour + 30*time.Minute)\n    fmt.Println("بعد 2.5 ساعة:", future)\n    \n    // طرح 7 أيام\n    past := now.Add(-7 * 24 * time.Hour)\n    fmt.Println("قبل أسبوع:", past)\n    \n    // استخدام AddDate للعمل مع التواريخ التقويمية\n    nextMonth := now.AddDate(0, 1, 0)\n    fmt.Println("بعد شهر:", nextMonth)\n}
\n\n

حساب الفرق بين التواريخ

\n

تقوم طريقة Sub() بإرجاع Duration:

\n
func main() {\n    start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)\n    end                

المدونات

توصيات الكتب