time
حزمة time توفر دوال وطرق متعلقة بالوقت والتقويم.
دالة time.Now() يمكنها الحصول على الوقت الحالي
func Now() Timenow := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001نوع البيانات الذي تُرجعه هو الهيكل Time، والذي يحتوي على طرق كثيرة لعمليات الوقت.
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 على ثوابت وحدات الوقت الأساسية
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 مساءً.
مثال
now := time.Now()تنسيق الإخراج 24 ساعة
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday Novإخراج التاريخ فقط
fmt.Println(now.Format("2006-01-02"))
//2022-11-17إخراج الوقت بنظام 12 ساعة فقط
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AMتحليل الوقت
عادةً تكون لدينا حاجة لتحويل سلسلة زمنية إلى هيكل وقت في 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 CSTTimer
المؤقت Timer هي قناة مُعرّفة للخارج، عندما ينتهي الوقت المحدد، ستتلقى القناة رسالة وتُغلق.
func NewTimer(d Duration) *Timerمن خلال time.NewTimer() يمكن إنشاء مؤقت جديد
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 يعمل بشكل دوري.
func NewTicker(d Duration) *Tickerمن خلال time.NewTicker() يمكن إنشاء مؤقت دوري جديد
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 حتى يستأنف حالة التشغيل.
func Sleep(d Duration)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.
