Skip to content

time

حزمة time توفر دوال وطرق متعلقة بالوقت والتقويم.

دالة time.Now() يمكنها الحصول على الوقت الحالي

go
func Now() Time
go
now := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001

نوع البيانات الذي تُرجعه هو الهيكل Time، والذي يحتوي على طرق كثيرة لعمليات الوقت.

go
func (t *Time) nsec() int32 // نانوثانية

func (t *Time) sec() int64 // ثانية

func (t *Time) unixSec() // إرجاع الثانية بصيغة Unix

func (t *Time) addSec(d int64) // إضافة ثواني

func (t *Time) setLoc(loc *Location) // تعيين المنطقة

func (t *Time) stripMono() // إزالة قراءة الساعة الأحادية من الوقت

func (t Time) After(u Time) // الحكم على ما إذا كان وقت بعد وقت آخر

func (t Time) Before(u Time) bool // الحكم على ما إذا كان وقت قبل وقت آخر

func (t Time) Equal(u Time) bool // الحكم على ما إذا كان وقتان يمثلان نفس اللحظة

func (t Time) Sub(u Time) Duration // حساب الفرق بين وقتين

func (t Time) Add(d Duration) Time // إضافة فاصل زمني

وحدات الوقت

تحتوي حزمة time على ثوابت وحدات الوقت الأساسية

go
const (
  minDuration Duration = -1 << 63
  maxDuration Duration = 1<<63 - 1
)

const (
  Nanosecond  Duration = 1
  Microsecond          = 1000 * Nanosecond
  Millisecond          = 1000 * Microsecond
  Second               = 1000 * Millisecond
  Minute               = 60 * Second
  Hour                 = 60 * Minute
)

نوعها هو time.Duration، أصغر وحدة هي النانوثانية، وأكبر وحدة هي الساعة.

التنسيق

يمكن تنسيق نوع الوقت للإخراج، لكن يجب الانتباه أن في Go قالب التنسيق ليس الشائع yyyy-mm-dd، بل يُستخدم وقت ميلاد Go كقالب. وقت ميلاد Go هو 2 يناير 2006 الساعة 15:04 مساءً.

مثال

go
now := time.Now()

تنسيق الإخراج 24 ساعة

go
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday Nov

إخراج التاريخ فقط

go
fmt.Println(now.Format("2006-01-02"))
//2022-11-17

إخراج الوقت بنظام 12 ساعة فقط

go
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AM

تحليل الوقت

عادةً تكون لدينا حاجة لتحويل سلسلة زمنية إلى هيكل وقت في Go حسب صيغة معينة، هذا ما سنفعله الآن.

go
func main() {
   location, err := time.LoadLocation("Asia/Shanghai")
   if err != nil {
      fmt.Println(err)
      return
   }

   inLocation, err := time.ParseInLocation("2006/01/02", "2012/10/12", location)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(inLocation.String())
}

الإخراج النهائي

2012-10-12 00:00:00 +0800 CST

Timer

المؤقت Timer هي قناة مُعرّفة للخارج، عندما ينتهي الوقت المحدد، ستتلقى القناة رسالة وتُغلق.

go
func NewTimer(d Duration) *Timer

من خلال time.NewTimer() يمكن إنشاء مؤقت جديد

sh
func main() {
  timer := time.NewTimer(time.Second)
  defer timer.Stop()
  select {
  case t := <-timer.C:
    fmt.Println(t)
  }
}
2023-09-25 21:25:03.5696803 +0800 CST m=+1.007908001

بعد الانتهاء من استخدام المؤقت، يجب إغلاقه في الوقت المناسب.

Ticker

المؤقت الدوري Ticker هو مؤقت، والفرق عن timer أن timer لمرة واحدة، بينما Ticker يعمل بشكل دوري.

go
func NewTicker(d Duration) *Ticker

من خلال time.NewTicker() يمكن إنشاء مؤقت دوري جديد

go
func main() {
  ticker := time.NewTicker(time.Second)
  defer ticker.Stop()
  for i := 0; i < 3; i++ {
    select {
    case t := <-ticker.C:
      fmt.Println(t)
    }
  }
}
2023-09-25 21:29:20.4429256 +0800 CST m=+1.009508401
2023-09-25 21:29:21.4512075 +0800 CST m=+2.017790301
2023-09-25 21:29:22.4501592 +0800 CST m=+3.016742001

وبالمثل، بعد الانتهاء من استخدام المؤقت الدوري، يجب إغلاقه أيضاً.

sleep

time.Sleep() يمكنها جعل goroutine الحالية في حالة تعليق لفترة زمنية معينة، وخلال هذه الفترة سيتم حظر goroutine حتى يستأنف حالة التشغيل.

go
func Sleep(d Duration)
sh
func main() {
  start := time.Now()
  fmt.Println(start)
  time.Sleep(time.Second * 2)
  end := time.Now()
  fmt.Println(end)
}
2023-09-25 21:36:35.7229057 +0800 CST m=+0.001627901
2023-09-25 21:36:37.7347742 +0800 CST m=+2.013496401

البرنامج أعلاه سيُحظر لمدة ثانيتين بعد إخراج start، ثم يُخرج end.

Golang تم تحريره بواسطة www.golangdev.cn