समय को संभालना बहुत जटिल होता है। समय के बारे में सामान्य गलत धारणाएँ निम्नलिखित होती हैं।
- एक दिन में 24 घंटे होते हैं।
- एक घंटे में 60 मिनट होते हैं।
- एक सप्ताह में सात दिन होते हैं।
- एक वर्ष में 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)। यदि आप दो समय के पलों की तुलना करते हैं, तो उन दो समयों के बीच होने वाले किसी भी लीप सेकंड को शामिल नहीं करेगा।