परिचय: तारीखों से आपको सिरदर्द क्यों होता है?
\nयदि आपने कभी C# में कोड लिखा है और मॉस्को में सर्वर और न्यूयॉर्क में क्लाइंट के बीच दिनांक और समय भेजने का कार्य किया है, तो आपने निश्चित रूप से अजीब बग देखे होंगे: "मेरे पास कल क्यों है?", "3 घंटे कहाँ से आए?"। परिचित स्थिति है ना?
\n.NET में तारीखों के साथ काम करने के लिए दो मुख्य उपकरण हैं: DateTime और DateTimeOffset। पहली नज़र में वे समान दिखते हैं - दोनों दिनांक और समय संग्रहीत करते हैं। लेकिन उनके बीच का अंतर महत्वपूर्ण है, और गलत चुनाव व्यावसायिक तर्क में विनाशकारी त्रुटियों का कारण बन सकता है।
इस ट्यूटोरियल में, हम वास्तविक उदाहरणों के साथ DateTime बनाम DateTimeOffset को समझेंगे, समझेंगे कि कब क्या उपयोग करना है, और समय क्षेत्रों के भ्रम को हमेशा के लिए भूल जाएंगे। चलिए शुरू करते हैं!
\n\nDateTime क्या है? (और यह एक जाल क्यों है)
\nDateTime एक संरचना है जो दिनांक और समय संग्रहीत करती है। यह .NET के पहले संस्करण से मौजूद है। लेकिन इसमें एक विशेषता है: यह समय क्षेत्र के बारे में जानकारी संग्रहीत नहीं करता है। अधिक सटीक रूप से, यह संग्रहीत करता है, लेकिन केवल एक Kind फ़्लैग के रूप में:
- \n
DateTimeKind.Unspecified— क्षेत्र निर्दिष्ट नहीं है (डिफ़ॉल्ट)। \n DateTimeKind.Utc— UTC समय। \n DateTimeKind.Local— सिस्टम का स्थानीय समय। \n
समस्या यह है कि यह फ़्लैग केवल जानकारी है। यह स्वचालित रूप से समय को परिवर्तित नहीं करता है। कल्पना करें कि आप मॉस्को में एक सर्वर पर DateTime को Kind = Local के साथ डेटाबेस में सहेजते हैं। फिर आप इस तारीख को व्लादिवोस्तोक में एक सर्वर पर पढ़ते हैं। क्या होगा? सही है - प्रोग्राम देखेगा कि Kind = Local है, और सोचेगा कि यह व्लादिवोस्तोक का स्थानीय समय है। जबकि वास्तव में यह मॉस्को है। पूर्ण आपदा।
// DateTime के साथ समस्या का उदाहरण\nDateTime moscowTime = new DateTime(2025, 3, 15, 14, 0, 0, DateTimeKind.Local);\nConsole.WriteLine(moscowTime); // 15.03.2025 14:00:00 (माना जाता है कि यह MSK है)\n\n// यदि यह कोड UTC+10 (व्लादिवोस्तोक) समय क्षेत्र वाले सर्वर पर चलाया जाता है\n// तो DateTime को व्लादिवोस्तोक के स्थानीय समय के रूप में व्याख्यायित किया जाएगा!\n// जिसके परिणामस्वरूप 7 घंटे की त्रुटि होगी।\n\n\nDateTimeOffset क्या है? (डेवलपर्स का उद्धारकर्ता)
\nDateTimeOffset एक अधिक स्मार्ट संरचना है जो .NET Framework 3.5 में दिखाई दी। यह दिनांक, समय और UTC के सापेक्ष ऑफ़सेट (Offset) संग्रहीत करती है। ऑफ़सेट उन घंटों और मिनटों की संख्या है जिनसे आपका स्थानीय समय UTC से भिन्न होता है।
उदाहरण के लिए: 2025-03-15 14:00:00 +03:00 — यह मॉस्को का समय है (UTC+3)। यदि आप इस मान को व्लादिवोस्तोक (UTC+10) में एक सर्वर पर भेजते हैं, तो .NET समझ जाएगा: "अच्छा, यह +03 है, इसलिए UTC = 11:00। अब मैं आसानी से स्थानीय समय में पुनर्गणना कर सकता हूँ: 21:00"। कोई जादू नहीं - शुद्ध गणित।
// DateTimeOffset के साथ उदाहरण\nDateTimeOffset moscowOffset = new DateTimeOffset(2025, 3, 15, 14, 0, 0, TimeSpan.FromHours(3));\nConsole.WriteLine(moscowOffset); // 15.03.2025 14:00:00 +03:00\n\n// अब, व्लादिवोस्तोक में सर्वर पर भी, हम सटीक ऑफ़सेट जानते हैं\n// और उपयोगकर्ता के लिए समय को सही ढंग से प्रदर्शित कर सकते हैं\n\n\nमुख्य अंतर: DateTime बनाम DateTimeOffset
\nआइए सब कुछ एक स्पष्ट तालिका में संक्षेपित करें। इससे आपको जल्दी से समझने में मदद मिलेगी कि किसी विशिष्ट स्थिति में क्या चुनना है।
\n\n1. समय क्षेत्र की जानकारी का भंडारण
\n- \n
- DateTime: केवल Kind फ़्लैग (Unspecified, Utc, Local) संग्रहीत करता है। स्वयं ऑफ़सेट संग्रहीत नहीं करता है। \n
- DateTimeOffset: UTC से सटीक ऑफ़सेट संग्रहीत करता है (उदाहरण के लिए, +03:00, -05:00)। \n
2. मानों की तुलना
\n- \n
- DateTime: "नंगे" मान के आधार पर तुलना करता है। यदि आपके पास 10:00 UTC और 10:00 MSK (UTC+3) है, तो
DateTime.Equals()कहेगा कि वे बराबर हैं। हालाँकि वास्तव में वे समय के अलग-अलग क्षण हैं। \n - DateTimeOffset: समय के क्षण (UTC) के आधार पर तुलना करता है। 10:00 UTC और 13:00 MSK होंगे