C# में दिनांक और समय के साथ उन्नत कार्य: बुनियादी संचालन से उच्च-प्रदर्शन समाधान तक
\nदिनांक और समय के साथ काम करना डेवलपमेंट में सबसे आम और साथ ही सबसे मुश्किल कार्यों में से एक है। टाइम ज़ोन में गलती या गलत फ़ॉर्मेटिंग प्रोडक्शन में गंभीर बग का कारण बन सकती है। इस लेख में हम बुनियादी DateTime कंस्ट्रक्टर से आगे बढ़कर उन्नत तकनीकों को समझेंगे: DateTimeOffset, टाइम ज़ोन के साथ काम, Stopwatch के माध्यम से उच्च-सटीक माप, साथ ही प्रदर्शन और थ्रेड-सुरक्षा के मुद्दे। यह सामग्री उन डेवलपर्स के लिए है जो C# में पारंगत हैं और .NET के लिए विश्वसनीय कोड लिखना चाहते हैं।
1. DateTime, DateTimeOffset और TimeSpan: सही प्रकार चुनना
\nकई डेवलपर डिफ़ॉल्ट रूप से DateTime का उपयोग करते हैं, लेकिन आधुनिक वितरित सिस्टम के युग में यह अक्सर सबसे अच्छा विकल्प नहीं होता है। आइए मुख्य अंतरों को समझें।
DateTime बनाम DateTimeOffset
\nDateTime समय के एक पल को टाइम ज़ोन के स्पष्ट संदर्भ के बिना संग्रहीत करता है। आप Kind (Local, Utc, Unspecified) निर्दिष्ट कर सकते हैं, लेकिन यह केवल एक लेबल है, ऑफ़सेट के बारे में पूरी जानकारी नहीं। दूसरी ओर, DateTimeOffset हमेशा UTC से ऑफ़सेट संग्रहीत करता है, जो इसे स्पष्ट और डेटाबेस और API में भंडारण के लिए पसंदीदा बनाता है।
// DateTime — भ्रामक हो सकता है\nDateTime localNow = DateTime.Now; // Kind = Local\nDateTime utcNow = DateTime.UtcNow; // Kind = Utc\n\n// DateTimeOffset — हमेशा स्पष्ट ऑफ़सेट\nDateTimeOffset preciseNow = DateTimeOffset.Now; // +05:30 (उदाहरण)\nDateTimeOffset utcOffset = DateTimeOffset.UtcNow; // +00:00\n\n// उनके बीच रूपांतरण\nDateTimeOffset fromDateTime = new DateTimeOffset(2024, 12, 25, 10, 0, 0, TimeSpan.FromHours(5).Add(TimeSpan.FromMinutes(30)));\nConsole.WriteLine(fromDateTime.Offset); // 05:30:00\n\nसुझाव: समय के एक पल को संग्रहीत करने के लिए (जैसे, रिकॉर्ड निर्माण तिथि) DateTimeOffset का उपयोग करें। उपयोगकर्ता को स्थानीय समय में दिखाने के लिए, प्रस्तुति स्तर पर कनवर्ट करें।
अंतराल के लिए TimeSpan
\nTimeSpan कोई तिथि संग्रहीत नहीं करता, केवल समय का अंतराल। यह दिनांक अंकगणित और संचालन की अवधि मापने के लिए एक अपरिहार्य उपकरण है।
DateTimeOffset start = DateTimeOffset.UtcNow;\n// ... कोई लंबी प्रक्रिया ...\nDateTimeOffset end = DateTimeOffset.UtcNow;\n\nTimeSpan duration = end - start;\nConsole.WriteLine($"ऑपरेशन में {duration.TotalMilliseconds} मिलीसेकंड लगे");\n// अंतराल बनाना\nTimeSpan workDay = new TimeSpan(8, 0, 0); // 8 घंटे\nDateTimeOffset deadline = DateTimeOffset.UtcNow.Add(workDay);\n\n\n2. पार्सिंग और फ़ॉर्मेटिंग: संस्कृति, ISO 8601 और प्रदर्शन
\nगलत पार्सिंग उन अनुप्रयोगों में बग का स्रोत है जो विभिन्न क्षेत्रीय सेटिंग्स के साथ काम करते हैं। आइए उन्नत विधियों को देखें।
\n\nParseExact और TryParseExact
\nज्ञात, सख्त प्रारूप वाले स्ट्रिंग के लिए ParseExact का उपयोग करें। इससे कोड की विश्वसनीयता और पठनीयता बढ़ती है।
string dateString = "2024-12-25T10:30:00+05:30";\n// ISO 8601 — सार्वभौमिक प्रारूप\nDateTimeOffset parsed = DateTimeOffset.ParseExact(\n dateString,\n "yyyy-MM-dd'T'HH:mm:sszzz",\n CultureInfo.InvariantCulture\n);\nConsole.WriteLine(parsed); // 25.12.2024 10:30:00 +05:30\n\n// TryParseExact के साथ सुरक्षित पार्सिंग\nif (DateTimeOffset.TryParseExact(\n "2024/12/25",\n new[] { "yyyy/MM/dd", "dd.MM.yyyy" },\n CultureInfo.InvariantCulture,\n DateTimeStyles.None,\n out DateTimeOffset result))\n{\n Console.WriteLine($"सफलतापूर्वक पार्स किया गया: {result}");\n}\n\nसलाह: लॉग और API में तिथियों को संग्रहीत करने के लिए हमेशा ISO 8601 प्रारूप ("o" स्पेसिफ़ायर) का उपयोग करें। यह किसी भी सिस्टम द्वारा स्पष्ट पढ़ने की गारंटी देता है।
संस्कृति को ध्यान में रखते हुए फ़ॉर्मेटिंग
\nउपयोगकर्ता को आउटपुट करते समय उसकी लोकेल को ध्यान में रखें, लेकिन आंतरिक आदान-प्रदान के लिए इन्वेरिएंट