C# में दिनांक और समय के साथ उन्नत कार्य: सिद्धांत से वास्तविक समस्याओं तक
\nदिनांक और समय के साथ कार्य करना डेवलपमेंट में सबसे सामान्य और साथ ही सबसे कपटी कार्यों में से एक है। प्रारंभिक स्तर पर हम बस DateTime.Now बनाते हैं और इसे कंसोल में प्रदर्शित करते हैं। लेकिन जब प्रोजेक्ट खिलौनों की सीमाओं से आगे बढ़ता है, तो जटिलताएँ उत्पन्न होती हैं: डेलाइट सेविंग टाइम, अलग-अलग समय क्षेत्र, उच्च सटीकता गणना या समय क्षेत्र के बिना दिनांक के साथ कार्य करने की आवश्यकता। इस लेख में हम C# (.NET) में दिनांक और समय के साथ कार्य करने की उन्नत तकनीकों पर चर्चा करेंगे जो आपको विश्वसनीय और पूर्वानुमानित कोड लिखने में मदद करेंगी।
1. DateTime, DateTimeOffset और TimeSpan: सही उपकरण चुनना
\nकई डेवलपर्स डिफ़ॉल्ट रूप से DateTime का उपयोग करते हैं, इसकी सीमाओं के बारे में सोचे बिना। उन्नत स्तर पर तीन मुख्य प्रकारों के बीच अंतर को समझना महत्वपूर्ण है।
DateTime
\nदिनांक और समय संग्रहीत करता है। इसकी मुख्य समस्या अस्पष्टता है। Kind गुण (Local, Utc, Unspecified) हमेशा स्पष्ट रूप से सेट नहीं किया जाता है, जिससे सीरियलाइज़ेशन या तुलना में त्रुटियाँ होती हैं।
DateTimeOffset
\nदिनांक, समय और UTC के सापेक्ष ऑफ़सेट संग्रहीत करता है। यह समय के क्षणों को संग्रहीत करने के लिए अनुशंसित प्रकार है, क्योंकि यह समयरेखा पर एक बिंदु को स्पष्ट रूप से परिभाषित करता है। उदाहरण के लिए, 2025-03-15T14:00:00+03:00 हमेशा एक विशिष्ट क्षण होता है, चाहे उपयोगकर्ता का समय क्षेत्र कुछ भी हो।
TimeSpan
\nकिसी विशिष्ट क्षण के बजाय समय अंतराल का प्रतिनिधित्व करता है। इसका उपयोग अंकगणित के लिए किया जाता है: दिनांकों के बीच अंतर, टाइमआउट, संचालन की अवधि।
\n\n// उदाहरण: DateTime बनाम DateTimeOffset\nDateTime localNow = DateTime.Now; // Kind = Local\nDateTime utcNow = DateTime.UtcNow; // Kind = Utc\n\nDateTimeOffset preciseNow = DateTimeOffset.Now; // हमेशा ऑफ़सेट के साथ\n\n// तुलना: DateTimeOffset अधिक स्पष्ट है\nConsole.WriteLine(preciseNow.Offset); // +03:00 या -05:00 आदि\n\n\nसुझाव: नए प्रोजेक्ट के लिए, समय के क्षणों को संग्रहीत करने के लिए DateTimeOffset, अंतराल के लिए TimeSpan का उपयोग करें, और DateTime का उपयोग केवल तब करें जब वास्तव में आवश्यक हो (उदाहरण के लिए, पुराने कोड के साथ संगतता के लिए)।
2. पार्सिंग और फ़ॉर्मेटिंग: FormatException से कैसे बचें
\nस्ट्रिंग्स से दिनांक पार्स करना कई त्रुटियों का स्रोत है, खासकर यदि स्ट्रिंग्स उपयोगकर्ताओं या विभिन्न संस्कृतियों से आती हैं।
\n\nसंस्कृति-निर्भर पार्सिंग
\nआंतरिक डेटा आदान-प्रदान (जैसे, JSON, API) के लिए CultureInfo.InvariantCulture का उपयोग करें। उपयोगकर्ता इनपुट के लिए, उपयोगकर्ता की संस्कृति को ध्यान में रखें।
// संस्कृति के साथ पार्सिंग\nstring dateString = "15.03.2025";\nvar ruCulture = new CultureInfo("ru-RU");\nDateTime parsedDate = DateTime.Parse(dateString, ruCulture);\n\n// अपरिवर्तनीय पार्सिंग (API के लिए अनुशंसित)\nstring isoString = "2025-03-15T14:00:00Z";\nDateTimeOffset parsedIso = DateTimeOffset.Parse(isoString, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);\n\n\nविश्वसनीयता के लिए TryParseExact
\nयदि स्ट्रिंग का प्रारूप ज्ञात है, तो स्पष्ट प्रारूप निर्दिष्ट करके TryParseExact का उपयोग करें। यह अप्रत्याशित अपवादों को समाप्त करता है।
string input = "2025-03-15 14:30";\nstring format = "yyyy-MM-dd HH:mm";\nif (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result))\n{\n Console.WriteLine($"सफल: {result}");\n}\nelse\n{\n Console.WriteLine("पार्सिंग त्रुटि");\n}\n\n\nकस्टम फ़ॉर्मेटिंग
\nमानक स्पेसिफ़ायर (d, D, t, T) अच्छे हैं, लेकिन सटीक नियंत्रण के लिए कस्टम फ़ॉर्मेट स्ट्रिंग्स का उपयोग करें।
\n\nDateTime now = DateTime.Now;\nConsole.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 2025-03-15 14:30:45.123\nConsole.WriteLine(now.ToString("dd MMMM yyyy, dddd")); // 15 मार्च 2025, शनिवार\n