Swift में तिथि और समय के साथ उन्नत कार्य: बुनियादी से अनुकूलन तक
\niOS/macOS डेवलपमेंट में तिथि और समय के साथ काम करना सबसे आम और साथ ही सबसे मुश्किल कार्यों में से एक है। Foundation API (Date, DateFormatter, Calendar) की सरलता अक्सर टाइमज़ोन, स्थानीयकरण या प्रदर्शन से जुड़ी गलतियों का कारण बनती है। इस लेख में हम Swift में तिथियों के साथ काम करने की उन्नत तकनीकों पर चर्चा करेंगे: सही पार्सिंग से लेकर उच्च-प्रदर्शन गणना तक, जो production-प्रोजेक्ट्स में काम आएगी।
\n\n1. DateFormatter: बारीक सेटिंग और कैशिंग
\nशुरुआती लोगों की सबसे आम गलती लूप या बार-बार कॉल किए जाने वाले मेथड में हर बार नया DateFormatter ऑब्जेक्ट बनाना है। DateFormatter बनाना एक महंगी प्रक्रिया है (इसे दोबारा उपयोग करने से 1000 गुना तक धीमी)।
\n\n// ❌ खराब: हर बार formatter बनाना\nfunc parseDate(from string: String) -> Date? {\n let formatter = DateFormatter()\n formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\n formatter.locale = Locale(identifier: "hi_IN")\n formatter.timeZone = TimeZone(secondsFromGMT: 0)\n return formatter.date(from: string)\n}\n\n// ✅ अच्छा: formatter को कैश करना\nprivate let isoDateFormatter: DateFormatter = {\n let f = DateFormatter()\n f.dateFormat = "yyyy-MM-dd HH:mm:ss"\n f.locale = Locale(identifier: "hi_IN")\n f.timeZone = TimeZone(secondsFromGMT: 0)\n return f\n}()\n\nfunc parseDateFast(from string: String) -> Date? {\n return isoDateFormatter.date(from: string)\n}\n\nउन्नत सलाह: निश्चित फॉर्मेट (जैसे ISO 8601) के लिए ISO8601DateFormatter का उपयोग करें — यह मानक DateFormatter से तेज़ काम करता है। उच्च प्रदर्शन की आवश्यकता वाले कस्टम फॉर्मेट के लिए, thread-local storage के साथ DateFormatter पर विचार करें:
extension DateFormatter {\n static let threadLocal: ThreadLocal<DateFormatter> = ThreadLocal {\n let f = DateFormatter()\n f.dateFormat = "dd.MM.yyyy"\n f.locale = Locale(identifier: "hi_IN")\n return f\n }\n}\n\n2. Calendar और DateComponents: त्रुटि-रहित गणना
\nतिथियों के साथ अंकगणित (एक दिन जोड़ना, महीने की शुरुआत ढूंढना) के लिए Calendar का उपयोग करें, न कि मैन्युअल रूप से सेकंड जोड़ने का। मैन्युअल रूप से 86400 सेकंड (24*60*60) जोड़ना डेलाइट सेविंग टाइम के दौरान गलत हो जाता है।
let calendar = Calendar.current\nlet now = Date()\n\n// ✅ सुरक्षित रूप से 1 दिन जोड़ना\nif let tomorrow = calendar.date(byAdding: .day, value: 1, to: now) {\n print("कल: \\(tomorrow)")\n}\n\n// ✅ वर्तमान महीने की शुरुआत ढूंढना\nlet startOfMonth = calendar.date(from: calendar.dateComponents([.year, .month], from: now))!\n\n// ✅ स्थानीयकरण के साथ घटक प्राप्त करना\nlet components = calendar.dateComponents([.weekday, .weekOfYear], from: now)\nprint("सप्ताह का दिन: \\(components.weekday ?? 0)") // 1 = रविवार (अमेरिका), 2 = सोमवार (भारत)\n\nउन्नत सलाह: उच्च-लोड गणना (जैसे कैलेंडर ग्रिड जनरेशन) के लिए Calendar और TimeZone को कैश करें। लूप में Calendar.current का उपयोग करने से बचें — यह हर बार सिस्टम सेटिंग्स को एक्सेस करता है।
3. उपयोगकर्ता के लिए स्थानीयकरण और फ़ॉर्मेटिंग
\nउपयोगकर्ता को कभी भी कच्ची तिथि न दिखाएं। पूर्वनिर्धारित स्टाइल (.short, .medium, .long, .full) के साथ DateFormatter और मानव-पठनीय सापेक्ष तिथियों ("कल", "3 दिन पहले") के लिए RelativeDateTimeFormatter का उपयोग करें।
// उपयोगकर्ता के स्थानीयकरण के साथ पूर्ण तिथि\nlet userFormatter = DateFormatter()\nuserFormatter.dateStyle = .long\nuserFormatter.timeStyle = .short\nprint(userFormatter.string(from: Date())) // "15 जून 2025, 14:30" (hi_IN के लिए)\n\n// सापेक्ष तिथि (iOS 13+)\nlet relativeFormatter = RelativeDateTimeFormatter()\nrelat