وقت کا ہینڈلنگ کامپلیکس ہے۔ وقت کے بارے میں عام غلط فہمیاں مندرجہ ذیل ہیں۔
- ایک دن میں 24 گھنٹے ہوتے ہیں۔
- ایک گھنٹے میں 60 منٹ ہوتے ہیں۔
- ایک ہفتے میں سات دن ہوتے ہیں۔
- ایک سال میں 365 دن ہوتے ہیں۔
مثال کے طور پر، ۱ یہ دکھاتا ہے کہ کسی خاص وقت کے نقطے میں 24 گھنٹوں کو شامل کرنا ہمیشہ نئے کیلنڈر کے دن کے نتیجے میں نہیں لاتا۔
اس لئے وقت کا سامنا کرتے ہوئے ہمیشہ "time"
پیکیج کا استعمال کریں کیونکہ یہ غلط فہمیوں کو ایک محفوظ اور زیادہ درست طریقے سے سنبھالنے میں مدد کرتا ہے۔
time.Time
کا استعمال اور فوری وقت کی نمائندگی کرنا
فوری وقت سے کام کرتے وقت، time.Time
اور اس کے تراکیب کا استعمال کریں تاکہ وقت کا موازنہ، وقت کو شامل یا منفی کرنا ممکن ہو۔
غیر مشورہ شدہ:
func isActive(now, start, stop int) bool {
return start <= now && now < stop
}
مشورہ شدہ:
func isActive(now, start, stop time.Time) bool {
return (start.Before(now) || start.Equal(now)) && now.Before(stop)
}
time.Duration
کا استعمال اور وقت کی مدت کی نمائندگی کرنا
وقت کی مدت سے وقت کا سامنا کرتے وقت، time.Duration
کا استعمال کریں۔
غیر مشورہ شدہ:
func poll(delay int) {
for {
// ...
time.Sleep(time.Duration(delay) * time.Millisecond)
}
}
poll(10) // کیا یہ سیکنڈ ہے یا ملی سیکنڈ؟
مشورہ شدہ:
func poll(delay time.Duration) {
for {
// ...
time.Sleep(delay)
}
}
poll(10*time.Second)
پہلی مثال پر واپس آتے ہیں، فوری وقت میں 24 گھنٹے شامل کرتے وقت، استعمال کرنے والے طریقہ کا استعمال منزل کے ارادے پر منحصر ہوتا ہے۔ اگر ہمیں مواقع کو نئے کیلنڈر کے دن کے بعد کے دن پر مواقع ہونا چاہئے تو ہمیں Time.AddDate
کا استعمال کرنا چاہئے۔ تاہم، اگر ہم یہ چاہتے ہیں کہ یہ یقینی لمحہ پچیس گھنٹے دوسرے لمحے سے بعد ہو تو ہمیں Time.Add
کا استعمال کرنا چاہئے۔
newDay := t.AddDate(0 /* years */, 0 /* months */, 1 /* days */)
maybeNewDay := t.Add(24 * time.Hour)
بیرونی نظاموں کے ساتھ time.Time
اور time.Duration
کا استعمال
جب بھی ممکن ہو، بیرونی نظاموں کے ساتھ time.Duration
اور time.Time
کا استعمال کریں۔ مثال کے طور پر:
- کمانڈ لائن فلیگز:
flag
وقت داری کوtime.ParseDuration
کے ذریعے دعم دیتا ہے۔ - JSON:
encoding/json
وقت کو RFC 3339 سٹرنگ میں تبدیل کرنے کا دعمUnmarshalJSON
ترکیب استعمال کرتا ہے۔ - SQL:
database/sql
داتا کوtime.Time
میں تبدیل کرتا ہے اور اس دعم کا استعمال دار ہے جو کہ اندرونی ڈرائیور دوا کرتا ہے۔ - YAML:
gopkg.in/yaml.v2
وقت کو RFC 3339 سٹرنگ اورtime.Duration
کا استعمالtime.ParseDuration
کے ذریعے دعم کرتا ہے۔
جب بھی ان تعاملات میں time.Duration
کا استعمال نہیں کیا جا سکتا ہے، تو فیلڈ نام میں int
یا float64
کا استعمال کرکے واقعے کے اصول کو شامل کریں۔
مثال کے طور پر، جب کہ encoding/json
وقت داری کا دعم نہیں دیتا ہے، تو فیلڈ نام میں وقفے کو شامل کیا گیا ہے۔
تجویز نہیں کیا جاتا ہے:
// {"interval": 2}
type Config struct {
Interval int `json:"interval"`
}
تجویز کیا جاتا ہے:
// {"intervalMillis": 2000}
type Config struct {
IntervalMillis int `json:"intervalMillis"`
}
جب بھی ان تعاملات میں time.Time
کا استعمال نہیں کیا جا سکتا ہے، تو بغیر کسی دوسرے معاہدے کے، string
کا استعمال کریں اور وقت کو RFC 3339 کے مطابق فارمیٹ کریں۔ اسی طرح، Time.UnmarshalText
کا استعمال کرتے وقت اس فارمیٹ کو پیش کرتا ہے اور یہ time.RFC3339
کے ذریعے Time.Format
اور time.Parse
کے لیے استعمال کیا جا سکتا ہے۔
اگرچہ یہ عملی مسئلہ نہیں ہوتا، مگر نوٹ کریں کہ "time"
پیکیج لیپ سیکنڈ وقت کے سٹمپس کو پارس کرنے کا دعم نہیں دیتا (8728)، اور حساب میں لیپ سیکنڈ کو شمار میں نہیں لیتا ہے (15190)۔ اگر آپ دو وقت کے لمحوں کا موازنہ کریں، تو ان دو لمحوں کے درمیان کوئی لیپ سیکنڈ شامل نہیں ہوگا۔