TimeZone iOS और macOS में एक Foundation क्लास है जो भौगोलिक क्षेत्रों के बीच सही समय रूपांतरण के लिए टाइम ज़ोन की जानकारी को सारांशित करता है। Apple Developer Documentation, 2024 के अनुसार, TimeZone टाइम ज़ोन आइडेंटिफ़ायर (IANA Time Zone Database), UTC से ऑफ़सेट और डेलाइट सेविंग टाइम नियमों के साथ काम करने के लिए विधियाँ प्रदान करता है। यह क्लास DateFormatter और Calendar के साथ एकीकृत है, जो तिथियों को फ़ॉर्मेट करते समय सही टाइम ज़ोन का स्वचालित अनुप्रयोग सुनिश्चित करता है। मैन्युअल ऑफ़सेट गणना के विपरीत, TimeZone डिवाइस का टाइम ज़ोन बदलने पर स्वचालित रूप से डेटा अपडेट करता है।
मुख्य बिंदु
TimeZone Swift में एक वैल्यू टाइप है जो भौगोलिक टाइम ज़ोन के बारे में जानकारी प्रदान करता है: UTC ऑफ़सेट, नाम, संक्षिप्त नाम और डेलाइट सेविंग टाइम नियम। Objective-C में, इस क्लास को NSTimeZone कहा जाता है। दोनों क्लासेस IANA Time Zone Database (जिसे Olson डेटाबेस के रूप में भी जाना जाता है) पर आधारित हैं, जिसमें 1970 से टाइम ज़ोन परिवर्तनों का इतिहास शामिल है।
प्रत्येक TimeZone इंस्टेंस एक टाइम ज़ोन आइडेंटिफ़ायर (जैसे Europe/Moscow), UTC से वर्तमान ऑफ़सेट सेकंड में, isDaylightSavingTime फ़्लैग और अगले ट्रांज़िशन की तिथि संग्रहीत करता है। आइडेंटिफ़ायर प्राथमिक कुंजी है: TimeZone(identifier:) को इनिशियलाइज़ करते समय, सिस्टम डिवाइस के टाइम ज़ोन डेटाबेस से संबंधित रिकॉर्ड लोड करता है।
IANA (2024) के अनुसार, डेटाबेस में 600 से अधिक अद्वितीय टाइम ज़ोन आइडेंटिफ़ायर हैं। Apple प्रत्येक iOS और macOS रिलीज़ के साथ इस डेटाबेस का एक स्नैपशॉट प्रदान करता है, जो नेटवर्क अनुरोधों की आवश्यकता के बिना सभी उपकरणों पर सुसंगत गणना सुनिश्चित करता है।
आर्किटेक्चर Foundation में TimeZone का निर्माण दो-स्तरीय प्रणाली पर हुआ है: टाइम ज़ोन आइडेंटिफ़ायर (मानव-पठनीय नाम) और इसका संख्यात्मक प्रतिनिधित्व (UTC ऑफ़सेट)। सिस्टम स्वचालित रूप से डिवाइस सेटिंग्स से वर्तमान टाइम ज़ोन चुनता है, लेकिन डेवलपर विशिष्ट फ़ॉर्मेटिंग संचालन के लिए इसे ओवरराइड कर सकता है।
TimeZone Calendar और DateFormatter से निकटता से जुड़ा हुआ है। तिथि को फ़ॉर्मेट करते समय, DateFormatter समय में एक पूर्ण क्षण (Date) को वांछित टाइम ज़ोन में स्ट्रिंग प्रतिनिधित्व में बदलने के लिए TimeZone इंस्टेंस की timeZone प्रॉपर्टी का उपयोग करता है। यदि timeZone सेट नहीं है, तो डिफ़ॉल्ट सिस्टम टाइम ज़ोन — TimeZone.current का उपयोग किया जाता है।
| प्रकार | इनिशियलाइज़ेशन | विशेषताएँ |
|---|---|---|
| वर्तमान | TimeZone.current | सेटिंग्स में क्षेत्र बदलने पर स्वचालित रूप से अपडेट होता है, डेलाइट सेविंग टाइम को ट्रैक करता है |
| निश्चित | TimeZone(identifier:) | डिवाइस क्षेत्र से स्वतंत्र। चयनित आइडेंटिफ़ायर को लगातार लागू करता है |
| UTC | TimeZone(secondsFromGMT: 0) | बिना सुधार के टाइम ज़ोन। आइडेंटिफ़ायर: GMT |
| मनमाना ऑफ़सेट | TimeZone(secondsFromGMT: 10800) | सेकंड में निश्चित ऑफ़सेट। डेलाइट सेविंग टाइम पर ध्यान नहीं देता |
महत्वपूर्ण नोट: TimeZone(identifier:) अज्ञात आइडेंटिफ़ायर के लिए nil लौटाता है। यह ऐप क्रैश का एक सामान्य कारण है — डेवलपर उपयोगकर्ता इनपुट से अमान्य आइडेंटिफ़ायर पास करते समय वैकल्पिक मान को संभालना भूल जाते हैं। IANA आइडेंटिफ़ायर के लिए, केस मायने रखता है: Europe/Moscow मान्य है, europe/moscow nil लौटाता है।
IANA Time Zone Database “क्षेत्र/शहर” (महाद्वीप/शहर) फ़ॉर्मेट का उपयोग करता है, जहाँ क्षेत्र महाद्वीपों में से एक है (Africa, America, Asia, Atlantic, Australia, Europe, Indian, Pacific) या एक महासागर, और शहर टाइम ज़ोन के कवरेज क्षेत्र में सबसे बड़ी आबादी वाला स्थान है। यह फ़ॉर्मेट आइडेंटिफ़ायर की विशिष्टता और पठनीयता सुनिश्चित करता है।
मुख्य फ़ॉर्मेट के अलावा, TimeZone तीन अतिरिक्त पहचान विधियों का समर्थन करता है: संक्षिप्त नाम (MSK, EST, PST), तीन-अक्षर टाइम ज़ोन कोड (GMT, UTC), और संख्यात्मक ऑफ़सेट (+0300, -0500)। हालाँकि, संक्षिप्त नाम अस्पष्ट हैं: EST का अर्थ Eastern Standard Time (GMT-5) या ऑस्ट्रेलिया में Eastern Summer Time (GMT+10) हो सकता है। Apple केवल IANA आइडेंटिफ़ायर का उपयोग करने की अनुशंसा करता है।
import Foundation
// सभी ज्ञात टाइम ज़ोन आइडेंटिफ़ायर प्राप्त करें
let allIdentifiers: [String] = TimeZone.knownTimeZoneIdentifiers
print("कुल टाइम ज़ोन: \(allIdentifiers.count)")
// क्षेत्र के अनुसार फ़िल्टर करें
let europeZones = allIdentifiers.filter { $0.hasPrefix("Europe/") }
print("यूरोपीय टाइम ज़ोन: \(europeZones)")
// संक्षिप्त नाम (प्रोडक्शन के लिए अनुशंसित नहीं)
if let moscowTimeZone = TimeZone(abbreviation: "MSK") {
print("GMT से MSK सेकंड: \(moscowTimeZone.secondsFromGMT())")
}
// ऑफ़सेट द्वारा आइडेंटिफ़ायर खोजें
let utcPlus3 = TimeZone(secondsFromGMT: 10800)
print("आइडेंटिफ़ायर: \(utcPlus3.identifier)")
संक्षिप्त नाम TimeZone.abbreviationDictionary में सभी ज्ञात टाइम ज़ोन के लिए संक्षिप्त नाम होते हैं, लेकिन यह शब्दकोश विशिष्टता की गारंटी नहीं देता: PST कुंजी America/Los_Angeles या Pacific/Pago_Pago में से किसी से मेल खा सकती है। प्रोडक्शन कोड के लिए, हमेशा IANA आइडेंटिफ़ायर का उपयोग करें।
TimeZone सभी क्षेत्रों के लिए स्वचालित रूप से डेलाइट सेविंग टाइम (DST) परिवर्तनों को ध्यान में रखता है जहाँ इसका पालन किया जाता है। सिस्टम IANA Time Zone Database से ऐतिहासिक डेटा का उपयोग करता है, जिसमें प्रत्येक टाइम ज़ोन के लिए सटीक ट्रांज़िशन तिथियाँ शामिल हैं। isDaylightSavingTime प्रॉपर्टी true लौटाती है यदि टाइम ज़ोन वर्तमान में डेलाइट सेविंग टाइम में है।
nextDaylightSavingTimeTransition विधि अगले ट्रांज़िशन की तिथि जानने की अनुमति देती है, जो भविष्य की घटनाओं की योजना बनाने के लिए उपयोगी है। यह कार्यक्षमता विशेष रूप से बार-बार DST नियम परिवर्तन वाले क्षेत्रों जैसे ब्राज़ील या मोरक्को के लिए महत्वपूर्ण है — 2024 तक, ब्राज़ील सालाना ट्रांज़िशन तिथियाँ बदलता था, और मैन्युअल गणना से एप्लिकेशन में त्रुटियाँ होती थीं।
Apple WWDC 2023 के अनुसार, ICU लाइब्रेरी (International Components for Unicode), जो Foundation का आधार है, प्रत्येक iOS अपडेट के साथ DST डेटा अपडेट करती है। एप्लिकेशन को सिस्टम अपडेट के बाद एक दिन से अधिक समय तक डेलाइट सेविंग टाइम डेटा कैश नहीं करना चाहिए — IANA डेटाबेस OS वर्जन अपडेट के बिना भी टाइम ज़ोन समायोजन के माध्यम से बदल सकता है।
import Foundation
// Europe/Moscow के लिए DST जाँचें
let moscow = TimeZone(identifier: "Europe/Moscow")!
let now = Date()
let isMoscowDST = moscow.isDaylightSavingTime(for: now)
print("मास्को वर्तमान में DST में: \(isMoscowDST)")
// अगली DST ट्रांज़िशन तिथि प्राप्त करें
if let nextTransition = moscow.nextDaylightSavingTimeTransition(
after: now
) {
let dstOffset = moscow.daylightSavingTimeOffset(
for: nextTransition
)
print("अगला ट्रांज़िशन: \(nextTransition), DST ऑफ़सेट: \(dstOffset)s")
}
// DST जागरूकता के साथ सुरक्षित रूपांतरण
let newYork = TimeZone(identifier: "America/New_York")!
let offsetNY = newYork.secondsFromGMT(for: now)
print("NY वर्तमान ऑफ़सेट: \(offsetNY / 3600)h")
महत्वपूर्ण बारीकी: secondsFromGMT(for:) निर्दिष्ट तिथि के लिए DST को ध्यान में रखता है, जबकि secondsFromGMT() केवल वर्तमान समय पर लागू होता है। ऐतिहासिक तिथियों को फ़ॉर्मेट करते समय, हमेशा Date पैरामीटर वाले संस्करण का उपयोग करें: secondsFromGMT(for: someHistoricalDate)। अंतर 1–2 घंटे तक हो सकता है, जो लॉग या ऐतिहासिक डेटा के लिए महत्वपूर्ण है।
किसी विशिष्ट टाइम ज़ोन के साथ तिथि को फ़ॉर्मेट करना TimeZone के साथ काम करते समय सबसे आम कार्य है। DateFormatter एक Date को स्ट्रिंग में बदलने के लिए timeZone प्रॉपर्टी का उपयोग करता है। यदि timeZone स्पष्ट रूप से सेट नहीं है, तो फ़ॉर्मेटर TimeZone.current — उपयोगकर्ता के डिवाइस पर सेट टाइम ज़ोन का उपयोग करता है, जो सर्वर डेटा के लिए अप्रत्याशित परिणाम दे सकता है।
import Foundation
// विशिष्ट टाइम ज़ोन में तिथि फ़ॉर्मेट करें
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let tokyo = TimeZone(identifier: "Asia/Tokyo")!
formatter.timeZone = tokyo
let tokyoTime = formatter.string(from: Date())
print("टोक्यो समय: \(tokyoTime)")
// उपयोगकर्ता चयन के लिए उपलब्ध आइडेंटिफ़ायर
let displayNames: [(String, String)] = TimeZone.knownTimeZoneIdentifiers
.prefix(20)
.map { ($0, TimeZone(identifier: $0)!.localizedName(
for: .generic, locale: .current
)) }
// दो टाइम ज़ोन की तुलना करें
let london = TimeZone(identifier: "Europe/London")!
let difference = tokyo.secondsFromGMT(for: Date())
- london.secondsFromGMT(for: Date())
print("टोक्यो-लंदन अंतर: \(difference / 3600)h")
// संक्षिप्त नाम शब्दकोश के साथ काम करें
let knownAbbrevs = TimeZone.abbreviationDictionary
for (abbr, ident) in knownAbbrevs.sorted(by: { $0.key < $1.key }).prefix(5) {
print("\(abbr) -> \(ident)")
}
टाइम ज़ोन का स्थानीयकृत नाम localizedName(for:locale:) के माध्यम से निर्दिष्ट भाषा में एक मानव-पठनीय नाम लौटाता है। उदाहरण के लिए, रूसी लोकेल के साथ Europe/Moscow के लिए, विधि रूसी नाम “Moskva” लौटाती है, और अंग्रेज़ी लोकेल के साथ — “Moscow Time”। उपलब्ध शैलियाँ: .standard (मानक नाम), .daylightSaving (डेलाइट सेविंग), और .shortGeneric (छोटा)।
import Foundation
let paris = TimeZone(identifier: "Europe/Paris")!
let nameRU = paris.localizedName(
for: .standard,
locale: Locale(identifier: "ru_RU")
)
print("रूसी नाम: \(nameRU)")
// जाँचें कि क्षेत्र एक ही दिन में है या नहीं
let isSameDay = Calendar.current.isDate(
Date(),
equalTo: Date(),
toGranularity: .day
)
print("टाइम ज़ोन में एक ही दिन: \(isSameDay)")
टाइम ज़ोन आइडेंटिफ़ायर का सीरियलाइज़ेशन डेटाबेस या UserDefaults में TimeZone को संग्रहीत करने का सबसे अच्छा अभ्यास है। आइडेंटिफ़ायर (Europe/Moscow जैसी स्ट्रिंग) सहेजें, सेकंड में ऑफ़सेट या संक्षिप्त नाम नहीं। DST परिवर्तनों के साथ ऑफ़सेट बदल सकता है, और संक्षिप्त नाम अस्पष्ट हैं। पुनर्स्थापना: TimeZone(identifier: savedString).
टाइम ज़ोन आइडेंटिफ़ायर के बजाय निश्चित ऑफ़सेट का उपयोग करना सबसे आम गलती है। TimeZone(secondsFromGMT: 10800) DST को ध्यान में नहीं रखता, इसलिए गर्मियों में Europe/Moscow के लिए यह निर्माण 1 घंटे का गलत ऑफ़सेट देता है। डेलाइट सेविंग टाइम वाले क्षेत्रों के लिए हमेशा IANA आइडेंटिफ़ायर का उपयोग करें।
TimeZone(identifier:) को इनिशियलाइज़ करते समय nil हैंडलिंग भूलना दूसरी सबसे आम त्रुटि है। यदि उपयोगकर्ता गलत आइडेंटिफ़ायर दर्ज करता है (जैसे “Europe/Moscow” के बजाय “moscow”), तो कंस्ट्रक्टर nil लौटाता है। वैकल्पिक मान को संभाले बिना, ऐप रनटाइम त्रुटि के साथ क्रैश हो जाता है। guard let या ज्ञात फ़ॉलबैक के साथ TimeZone(identifier:) का उपयोग करें।
भविष्य की तिथियों के साथ काम करते समय DST को अनदेखा करना। TimeZone.secondsFromGMT(for:) किसी विशिष्ट तिथि के लिए ऑफ़सेट प्राप्त करने का एकमात्र सही तरीका है। ऐतिहासिक या भविष्य की तिथियों के लिए बिना पैरामीटर के secondsFromGMT() का उपयोग करने से वर्तमान क्षण के लिए ऑफ़सेट मिलता है, जो निर्दिष्ट तिथि पर वास्तविक ऑफ़सेट से मेल नहीं खा सकता, विशेष रूप से उन क्षेत्रों के लिए जिन्होंने DST को समाप्त या शुरू किया है।
Stack Overflow (2024) के अनुसार, लगभग 15% DateFormatter प्रश्न गलत timeZone कॉन्फ़िगरेशन से संबंधित हैं। एक सामान्य परिदृश्य: सर्वर UTC में तिथि भेजता है, डेवलपर फ़ॉर्मेटर का timeZone सेट किए बिना इसे फ़ॉर्मेट करता है, और तिथि डिवाइस के टाइम ज़ोन में प्रदर्शित होती है, जिससे विभिन्न क्षेत्रों के उपयोगकर्ताओं में भ्रम पैदा होता है। नियम: सर्वर डेटा के लिए हमेशा फ़ॉर्मेटर का timeZone स्पष्ट रूप से सेट करें।
अक्सर पूछे जाने वाले प्रश्न
TimeZone iOS और macOS में टाइम ज़ोन के साथ काम करने के लिए एक Foundation क्लास है। यह UTC ऑफ़सेट, डेलाइट सेविंग टाइम नियमों और IANA Time Zone Database पर आधारित टाइम ज़ोन आइडेंटिफ़ायर के बारे में जानकारी प्रदान करता है।
तीन फ़ॉर्मेट: IANA आइडेंटिफ़ायर (Europe/Moscow), संक्षिप्त नाम (MSK, EST), और संख्यात्मक ऑफ़सेट (+0300)। Apple प्रोडक्शन कोड के लिए एकमात्र स्पष्ट फ़ॉर्मेट के रूप में IANA आइडेंटिफ़ायर का उपयोग करने की अनुशंसा करता है।
स्वचालित रूप से secondsFromGMT(for:) और isDaylightSavingTime(for:) विधियों के माध्यम से। TimeZone ऐतिहासिक IANA डेटा का उपयोग करता है, जो प्रत्येक iOS रिलीज़ के साथ अपडेट होता है, जो किसी भी तिथि के लिए सही DST ट्रांज़िशन सुनिश्चित करता है।
TimeZone.current उपयोगकर्ता द्वारा सेटिंग्स में चयनित टाइम ज़ोन लौटाता है (भौगोलिक से भिन्न हो सकता है)। TimeZone.system डिवाइस टाइम ज़ोन लौटाता है, जो स्वचालित रूप से भू-स्थान द्वारा निर्धारित होता है और उपयोगकर्ता द्वारा ओवरराइड नहीं किया जा सकता।
TimeZone.current वर्तमान डिवाइस टाइम ज़ोन लौटाता है। आइडेंटिफ़ायर प्राप्त करने के लिए, identifier प्रॉपर्टी का उपयोग करें: TimeZone.current.identifier। स्थानीयकृत नाम के लिए, localizedName(for:locale:) कॉल करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें