समय को संभालना बहुत जटिल होता है। समय के बारे में सामान्य गलत धारणाएँ निम्नलिखित होती हैं।

  1. एक दिन में 24 घंटे होते हैं।
  2. एक घंटे में 60 मिनट होते हैं।
  3. एक सप्ताह में सात दिन होते हैं।
  4. एक वर्ष में 365 दिन होते हैं।

उदाहरण के लिए, 1 का अर्थ है कि किसी निश्चित समय में 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 का उपयोग करना चाहिए। हालांकि, यदि हमें सुनिश्चित करना हो कि किसी क्षण से 24 घंटे बाद का समय है, तो हमें Time.Add का उपयोग करना चाहिए।

newDay := t.AddDate(0 /* वर्ष */, 0 /* महीने */, 1 /* दिन */)
maybeNewDay := t.Add(24 * time.Hour)

बाहरी सिस्टम के साथ time.Time और time.Duration का उपयोग

जब भी संभव हो, बाहरी सिस्टम के साथ बातचीत में time.Duration और time.Time का उपयोग करें, जैसे:

  • कमांड लाइन फ्लैग: flag time.ParseDuration के माध्यम से time.Duration का समर्थन करता है।
  • JSON: encoding/json अपने UnmarshalJSON मेथड का उपयोग करके time.Time को RFC 3339 स्ट्रिंग में एन्कोड करता है।
  • SQL: database/sql DATETIME या TIMESTAMP कॉलम को time.Time में परिवर्तित करता है, और यह जांचता है कि उद्योतक ड्राइवर का समर्थन करता है या नहीं।
  • YAML: gopkg.in/yaml.v2 time.ParseDuration के माध्यम से time.Time को RFC 3339 स्ट्रिंग के रूप में और time.Duration का समर्थन करता है।

जब time.Duration इन बातचीतों में उपयोग नहीं किया जा सकता है, तो int या float64 का उपयोग करें और फ़ील्ड नाम में इकाई शामिल करें।

उदाहरण के लिए, क्योंकि encoding/json time.Duration का समर्थन नहीं करता, इकाई फ़ील्ड नाम में शामिल की जाती है।

पसंद नहीं किया गया:

// {"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.Format और time.Parse के माध्यम से time.RFC3339 के माध्यम से उपयोग किया जा सकता है।

यद्यपि यह एक व्यावहारिक समस्या नहीं है, कृपया ध्यान दें कि "time" पैकेज लीप सेकंड समयचिह्नों को पार्स नहीं करता है (8728), और गणनाओं में लीप सेकंड को ध्यान में नहीं लेता है (15190)। यदि आप दो समय के पलों की तुलना करते हैं, तो उन दो समयों के बीच होने वाले किसी भी लीप सेकंड को शामिल नहीं करेगा।