وقت کا ہینڈلنگ کامپلیکس ہے۔ وقت کے بارے میں عام غلط فہمیاں مندرجہ ذیل ہیں۔

  1. ایک دن میں 24 گھنٹے ہوتے ہیں۔
  2. ایک گھنٹے میں 60 منٹ ہوتے ہیں۔
  3. ایک ہفتے میں سات دن ہوتے ہیں۔
  4. ایک سال میں 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 کا استعمال کریں۔ مثال کے طور پر:

جب بھی ان تعاملات میں 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)۔ اگر آپ دو وقت کے لمحوں کا موازنہ کریں، تو ان دو لمحوں کے درمیان کوئی لیپ سیکنڈ شامل نہیں ہوگا۔