Go में दिनांक और समय के साथ उन्नत कार्य: मूल बातों से अनुकूलन तक
\n\nआधुनिक वेब डेवलपमेंट में, दिनांक और समय के साथ काम करना सबसे सामान्य और साथ ही सबसे कठिन कार्यों में से एक है। Go (Golang) भाषा एक शक्तिशाली time पैकेज प्रदान करती है, लेकिन इसके उन्नत उपयोग के लिए आंतरिक तंत्र, समय क्षेत्रों के साथ काम, प्रदर्शन और edge-केस की गहरी समझ की आवश्यकता होती है। इस लेख में, हम उन तकनीकों पर चर्चा करेंगे जो बुनियादी उदाहरणों से परे हैं और आपको समय के साथ काम करने के लिए विश्वसनीय, तेज़ और सही कोड लिखने में मदद करेंगी।
1. time.Duration के साथ निपुणता: केवल Sleep नहीं
\n\ntime.Duration केवल एक समय अंतराल नहीं है, बल्कि नैनोसेकंड में एक int64 है। इसे समझना कुशल गणना और तुलना के लिए संभावनाएं खोलता है।
1.1. Duration तुलना का अनुकूलन
\nसीमाओं की जांच के लिए if/else श्रृंखलाओं से बचें। अंकगणित का उपयोग करें:
package main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc main() {\n d := 2 * time.Second\n\n // खराब: अस्थायी ऑब्जेक्ट बनाता है\n if d >= time.Second && d <= 5*time.Second {\n fmt.Println("सीमा में")\n }\n\n // अच्छा: int64 तुलना\n const minNs = int64(time.Second)\n const maxNs = int64(5 * time.Second)\n if ns := int64(d); ns >= minNs && ns <= maxNs {\n fmt.Println("सीमा में (अनुकूलित)")\n }\n}\n\n\n1.2. Duration को गोल करना और छोटा करना
\nRound() विधि दिए गए गुणक तक गोल करती है, Truncate() शेष को हटा देती है। यह कैशिंग और समय विंडो द्वारा डेटा समूहीकरण के लिए महत्वपूर्ण है।
now := time.Now()\n// निकटतम मिनट तक गोल करें\nrounded := now.Round(time.Minute)\n// घंटे की शुरुआत तक छोटा करें\ntruncated := now.Truncate(time.Hour)\nfmt.Println(rounded, truncated)\n\n\n2. उन्नत पार्सिंग और फ़ॉर्मेटिंग: RFC3339 से परे
\n\nGo magic reference date का उपयोग करता है: Mon Jan 2 15:04:05 MST 2006 (01/02 03:04:05PM '06 -0700)। इस स्मरणीय को समझना किसी भी प्रारूप को बनाने की कुंजी है।
2.1. timezone समर्थन के साथ कस्टम प्रारूप
\nअक्सर "2024-03-15 14:30:00 +0300" प्रारूप की आवश्यकता होती है। reference layout का उपयोग करके स्ट्रिंग बनाएं:
\n\nlayout := "2006-01-02 15:04:05 -0700"\nt := time.Now()\nfmt.Println(t.Format(layout))\n// आउटपुट: 2024-03-15 14:30:00 +0300\n\n\n2.2. गैर-मानक स्ट्रिंग्स को संभालना
\nयदि इनपुट डेटा का परिवर्तनीय प्रारूप है, तो विशिष्टता के घटते क्रम में कई Parse का उपयोग करें। सख्त सत्यापन के लिए, स्पष्ट स्थान के साथ time.ParseInLocation का उपयोग करें।
func parseFlexible(s string) (time.Time, error) {\n layouts := []string{\n time.RFC3339,\n "2006-01-02 15:04:05",\n "2006-01-02",\n "Jan 2, 2006",\n }\n for _, layout := range layouts {\n if t, err := time.Parse(layout, s); err == nil {\n return t, nil\n }\n }\n return time.Time{}, fmt.Errorf("पार्स करने में विफल: %s", s)\n}\n\n\n2.3. "Z" और "+00:00" के साथ समस्या
\nRFC3339 दोनों विकल्पों की अनुमति देता है। time.Parse उन्हें सही ढंग से संभालता है, लेकिन फ़ॉर्मेटिंग करते समय मानक आउटपुट के लिए time.RFC3339 का उपयोग करें।
3. समय क्षेत्रों के साथ कार्य: सामान्य गलतियों से बचना
\n\nसमय क्षेत्र बग का मुख्य स्रोत हैं। Go time.Time को एक पूर्ण क्षण (Unix timestamp) + ऑफ़सेट के रूप में संग्रहीत करता है। यह तुलना संचालन को सुरक्षित बनाता है, लेकिन सहज नहीं।
3.1. IANA Time Zone Database से स्थान लोड करना
\nIANA डेटाबेस से सही नाम के साथ time.LoadLocation का उपयोग करें (उदाहरण के लिए, "Europe/Moscow")। कभी भी संक्षिप्ताक्षरों (MSK, EST) का उपयोग न करें - वे अस्पष्ट हैं।
loc, err := time.LoadLocation("Europe/Moscow")\nif err != nil {\n log.Fa