परिचय: आपका तारीखों वाला कोड "बार-बार" क्यों काम नहीं करता?
\n\nकल्पना करें: आप एक कैलेंडर या रिमाइंडर ऐप बना रहे हैं। बस वर्तमान तारीख लेनी है और उसमें एक दिन जोड़ना है। लगता है इसमें क्या गलत हो सकता है? आप Stack Overflow खोलते हैं, "How do I add 1 day to an NSDate?" नामक हजारों व्यूज़ वाला प्रश्न पाते हैं — और समझ जाते हैं कि इतना सरल ऑपरेशन भी एक बुरा सपना बन सकता है।
\n\nइस लेख में हम Swift में NSDate में दिन जोड़ने की शीर्ष गलतियों का विश्लेषण करेंगे, उनसे बचना सीखेंगे और सही, विश्वसनीय कोड लिखेंगे। आप जानेंगे कि क्यों NSDate और timeInterval वाला पुराना तरीका बग्स का रास्ता है, और कैसे Apple के आधुनिक API स्थिति को बचाते हैं।
चलिए, तारीखों को हमेशा के लिए समझ लेते हैं!
\n\nगलती #1: दिन जोड़ने के लिए timeInterval का उपयोग करना
\n\nविनाशकारी कोड
\nसबसे आम गलती जिसमें शुरुआती फंसते हैं:
\n\nlet today = NSDate()\nlet oneDay: TimeInterval = 24 * 60 * 60 // 86,400 सेकंड\nlet tomorrow = today.addingTimeInterval(oneDay)\n\nपहली नज़र में — तार्किक लगता है। एक दिन में 24 घंटे, एक घंटे में 60 मिनट, एक मिनट में 60 सेकंड। गुणा करें, जोड़ें — हो गया!
\n\nलेकिन नहीं। यह केवल 99% मामलों में काम करता है, और 1% मामलों में यह उपयोगकर्ताओं के लिए पूरा ऐप तोड़ देता है। क्यों?
\n\nछिपे हुए खतरे
\n- \n
- डेलाइट सेविंग टाइम / विंटर टाइम में बदलाव। घड़ी बदलने के दिन, एक दिन 23 या 25 घंटे का हो सकता है। आपके 86,400 सेकंड 83,400 या 90,000 में बदल जाएंगे। \n
- लीप सेकंड। हालांकि यह दुर्लभ है, लेकिन आधिकारिक रूप से मौजूद हैं। \n
- समय क्षेत्र। यदि उपयोगकर्ता यात्रा कर रहा है, तो उसका स्थानीय समय गड़बड़ा सकता है। \n
- सेकंड तक सटीकता। आप सिर्फ "अगला दिन" नहीं जोड़ रहे, बल्कि ठीक 24 घंटे जोड़ रहे हैं — ये अलग चीजें हैं। \n
एक उदाहरण चाहिए? 28 मार्च 2021 को यूक्रेन में रात 3:00 बजे घड़ी एक घंटा आगे कर दी गई। यदि आपने रात 2:30 बजे timeInterval जोड़ा, तो आपको 3:30 नहीं, बल्कि... 4:30 मिलेगा? या 2:30? यह इस बात पर निर्भर करता है कि सिस्टम बदलाव को कैसे संभालता है। संक्षेप में, अफरा-तफरी।
गलती #2: एक ही प्रोजेक्ट में NSDate और Date को मिलाना
\n\nSwift में दो प्रकार की तारीखें हैं: पुराना NSDate (Objective-C से) और आधुनिक Date (Swift-native)। कई डेवलपर्स, विशेषकर जो पुराने ट्यूटोरियल या 2014 के Stack Overflow उत्तर पढ़ते हैं, NSDate का उपयोग जारी रखते हैं।
समस्या यह है कि NSDate एक क्लास (reference type) है, जबकि Date एक स्ट्रक्चर (value type) है। कोड में इन्हें मिलाने से होता है:
- \n
- म्यूटेबिलिटी से जुड़े अस्पष्ट बग \n
- अनावश्यक रूपांतरण (
as Date,as NSDate) \n - API में भ्रम \n
नियम: नए Swift कोड में केवल Date का उपयोग करें। NSDate को केवल Objective-C लाइब्रेरीज़ के साथ संगतता के लिए छोड़ दें।
गलती #3: Calendar और TimeZone को अनदेखा करना
\n\nजब आप तारीख में "1 दिन" जोड़ते हैं, तो आप इसे कैलेंडर के संदर्भ में कर रहे होते हैं। कैलेंडर निर्दिष्ट किए बिना, सिस्टम Calendar.current का उपयोग करता है — यह उपयोगकर्ता का कैलेंडर है (आमतौर पर ग्रेगोरियन)।
लेकिन क्या होगा यदि उपयोगकर्ता सऊदी अरब से है और इस्लामिक कैलेंडर का उपयोग करता है? या जापानी कैलेंडर? स्पष्ट रूप से कैलेंडर निर्दिष्ट किए बिना, आप अप्रत्याशित परिणाम प्राप्त करने का जोखिम उठाते हैं।
\n\nगलत कोड का उदाहरण
\nvar dateComponents = DateComponents()\ndateComponents.day = 1\nlet tomorrow = Calendar.current.date(byAdding: dateComponents, to: Date())\n\nयह कोड लगभग सही है, लेकिन यह अंतर्निहित रूप से डिवाइस के समय क्षेत्र का उपयोग करता है। यदि आप UTC में सर्वर तारीखों के साथ काम कर रहे हैं, और उपयोगकर्ता मॉस्को (UTC+3) में है, तो "कल" 3 घंटे पहले आ सकता है।
\n\nसही समाधान: Calendar + DateComponents
\n\nदिन जोड़ने का स्वर्ण मानक
\nयहां बताया गया है कि 1 दिन सही तरीके से कैसे जोड़ें