الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 4 من 539/50 في الدورة~12 min
دروس الوحدة (4/5)

حزمة "الوقت".

تصمم الحزمة time ثلاثة مفاهيم متميزة: اللحظات (time.Time)، المدد (time.Duration) و الأدوات الدورية (مؤقت، وشريط). التمييز بينهما أمر بالغ الأهمية: اللحظة هي نقطة على الخط الزمني، والمدة هي فاصل زمني.

time.Time — اللحظات

Go
now := time.Now()                // current instant in the local timezone
utc := now.UTC()                 // same instant in UTC
later := now.Add(2 * time.Hour)  // add a duration
diff := later.Sub(now)           // 2h0m0s (it's a Duration)

fmt.Println(now.Year(), now.Month(), now.Day())
fmt.Println(now.Weekday())

time.Time غير قابل للتغيير: جميع الأساليب Add، Truncate، Round تُرجع Time جديدًا.

لمقارنة اللحظات، استخدم Before، After، Equal. لا تستخدم == إذا كانت اللحظات تحتوي على مناطق زمنية/ساعات رتيبة مختلفة.

time.Duration — فواصل زمنية

Go
d := 250 * time.Millisecond
fmt.Println(d)         // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)

const timeout = 5 * time.Second

time.Duration هو اسم مستعار لـ int64 يحسب نانو ثانية. الثوابت time.Nanosecond، time.Microsecond، time.Millisecond، time.Second، time.Minute، time.Hour هي من النوع Duration.

التحليل والتنسيق: التخطيط المرجعي

لا يستخدم Go سلاسل مثل YYYY-MM-DD. ويستخدم ** لحظة مرجعية أساسية **:

Code
Mon Jan 2 15:04:05 MST 2006

على سبيل المثال 01/02 03:04:05PM '06 -0700. من خلال حفظ هذا التخطيط (التذكير: 1-2-3-4-5-6-7) يمكنك تنسيق أي تاريخ:

Go
const layout = "2006-01-02 15:04:05"
s := time.Now().Format(layout)            // "2026-05-16 14:30:00"
t, err := time.Parse(layout, "2026-05-16 14:30:00")

يقدم stdlib تخطيطات جاهزة: time.RFC3339 ("2006-01-02T15:04:05Z07:00")، time.RFC1123، time.Kitchen ("3:04PM").

Go
fmt.Println(time.Now().Format(time.RFC3339))

قياس الوقت

Go
start := time.Now()
work()
elapsed := time.Since(start)  // = time.Now().Sub(start)
fmt.Println("ci ha messo", elapsed)

time.Since يستخدم الساعة الرتيبة: لا تتأثر بتعديلات ساعة النظام (NTP، التوقيت الصيفي). لقياسات الأداء هذا هو ما تريده.

الموقت وشريط

  • time.After(d) يُرجع chan time.Time الذي يتلقى مرة واحدة فقط بعد d. مفيد في select:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) هو متغير قابل للإيقاف (t.Stop()).
  • time.NewTicker(d) يرسل بشكل متكرر كل d. تذكر defer ticker.Stop() لتجنب تسربات goroutine.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

تمارين

تمرين#go.m8.l4.e1
المحاولات: 0جارٍ التحميل…

اطبع اللحظة الحالية المنسقة وفقًا للوقت.RFC3339.

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

تمرين#go.m8.l4.e2
المحاولات: 0جارٍ التحميل…

قم بقياس المدة الزمنية التي يستغرقها النوم لمدة 10 مللي ثانية باستخدام الوقت منذ ذلك الحين واطبع النتيجة.

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

Quiz#go.m8.l4.e3
جاهز

ما هو نوع الثابت "الوقت.الثانية"؟

Go
d := time.Second
// d ha tipo ???
خيارات الإجابة