DateIntervalFormatter iOS और macOS में Foundation का एक वर्ग है जो दिनांक श्रेणियों को स्थानीयकृत स्ट्रिंग्स में स्वरूपित करने के लिए डिज़ाइन किया गया है: “21–25 जुलाई 2024”, “21 से 25 जुलाई 2024” या “Jul 21–25, 2024”। Apple Developer Documentation, 2024 के अनुसार, DateIntervalFormatter स्वचालित रूप से निर्धारित करता है कि कौन से दिनांक घटकों को दोहराना है (यदि श्रेणी एक महीने के भीतर है, तो महीना एक बार दिखाया जाता है), और विभाजकों और शब्द क्रम को स्थानीयकृत करता है। दो स्वरूपित तिथियों को मैन्युअल रूप से जोड़ने के विपरीत, यह वर्ग भाषा के व्याकरणिक नियमों को ध्यान में रखता है। यह वर्ग iOS 8 और macOS 10.10 से उपलब्ध है।
मुख्य बातें
DateIntervalFormatter Foundation में Formatter का एक उपवर्ग है जो DateInterval ऑब्जेक्ट (दो तिथियों के बीच की श्रेणी) लेता है और उस श्रेणी का वर्णन करने वाला एक स्थानीयकृत स्ट्रिंग लौटाता है। उदाहरण के लिए, 21 से 25 जुलाई 2024 की श्रेणी के लिए, परिणाम hi_IN के लिए “21–25 जुलाई 2024” होगा। वर्ग बुद्धिमानी से दोहराए जाने वाले तत्वों को समूहित करता है: यदि दोनों तिथियाँ एक ही महीने में हैं, तो महीने का नाम एक बार दिखाया जाता है।
DateIntervalFormatter का मुख्य मूल्य श्रेणी व्याकरण का स्वचालित प्रबंधन है। मैन्युअल रूप से स्वरूपित करते समय, एक डेवलपर को आरंभ/अंत महीने/वर्ष की तुलना करनी होगी, विभाजक चुनना होगा (डैश, “से”, “bis”), और विभक्ति को संभालना होगा। DateIntervalFormatter CLDR (सामान्य स्थानीय डेटा भंडार) डेटा के आधार पर यह स्वचालित रूप से करता है, अंतर्राष्ट्रीय अनुप्रयोगों में बग को कम करता है, विशेष रूप से जटिल व्याकरण वाली भाषाओं के लिए।
Unicode CLDR v44 (2024) के अनुसार, दिनांक अंतराल स्वरूपण नियम भाषाओं के बीच काफी भिन्न होते हैं। जर्मन “bis” (21.–25. Juli 2024) पूर्वसर्ग का उपयोग करता है, फ़्रेंच “au” (du 21 au 25 juillet 2024) का उपयोग करता है, जापानी हाइफ़न (2024 Jul 21–25) का उपयोग करता है। DateIntervalFormatter डेवलपर की ओर से अतिरिक्त कोड के बिना इन सभी विविधताओं को कवर करता है।
कार्य सिद्धांत DateIntervalFormatter का एक श्रेणी बनाने वाली दो तिथियों का विश्लेषण करने और स्थानीय सेटिंग्स को ध्यान में रखते हुए इष्टतम स्ट्रिंग प्रतिनिधित्व का चयन करने पर आधारित है। वर्ग दिनांक घटकों (वर्ष, महीना, दिन) की तुलना करता है और समूहीकरण निर्णय लेता है: यदि वर्ष समान है, तो एक बार दिखाया जाता है; यदि महीना समान है, तो एक बार दिखाया जाता है; यदि दिन भिन्न हैं, तो एक दिन श्रेणी दिखाई जाती है।
| श्रेणी | hi_IN |
|---|---|
| एक दिन | 21 जुलाई 2024 |
| महीने के भीतर | 21–25 जुलाई 2024 |
| अलग-अलग महीने | 21 जुलाई – 5 अगस्त 2024 |
| अलग-अलग वर्ष | 25 दिसंबर 2024 – 5 जनवरी 2025 |
| समय के साथ | 21 जुलाई 2024, 14:30–16:45 |
समूहीकरण तर्क CLDR टेम्पलेट्स के आधार पर कार्यान्वित किया गया है। स्वरूपक प्रत्येक दिनांक घटक (Calendar.Component: year, month, day) की समानता की जाँच बड़े से छोटे के क्रम में करता है। एक बार जब कोई घटक भिन्न होता है, तो सभी छोटे घटक दोनों तिथियों के लिए दिखाए जाते हैं। उदाहरण के लिए, 21–25 जुलाई के लिए: वर्ष मेल खाता है, महीना मेल खाता है, दिन भिन्न है → महीना एक बार दिखाया जाता है, दिन प्रत्येक तिथि के लिए दिखाए जाते हैं।
महत्वपूर्ण नोट: DateIntervalFormatter API के माध्यम से विभाजक को अनुकूलित करने का समर्थन नहीं करता है। विभाजक स्थानीय सेटिंग्स द्वारा निर्धारित किया जाता है और इसे ओवरराइड नहीं किया जा सकता है। यदि एक गैर-मानक विभाजक की आवश्यकता है (उदाहरण के लिए, “से” के बजाय “तक”), तो आपको DateFormatter का उपयोग करके मैन्युअल रूप से तिथियों को स्वरूपित करना होगा और एक कस्टम विभाजक के साथ स्ट्रिंग्स को संयोजित करना होगा।
DateIntervalFormatter दो सेट शैलियाँ प्रदान करता है: dateStyle और timeStyle श्रेणी के प्रत्येक छोर के लिए। ये शैलियाँ DateFormatter के समान काम करती हैं: .none घटक को छिपाता है, .short एक छोटा प्रारूप देता है (21/07/2024), .medium (21 जुल 2024), .long (21 जुलाई 2024), .full (रविवार, 21 जुलाई 2024)। dateStyle और timeStyle को संयोजित करके, विस्तार के विभिन्न स्तर प्राप्त किए जा सकते हैं।
महत्वपूर्ण: dateStyle और timeStyle श्रेणी के दोनों छोरों पर समान रूप से लागू होते हैं। आप शुरुआत और अंत के लिए अलग-अलग शैलियाँ सेट नहीं कर सकते (उदाहरण के लिए, शुरुआत के लिए .medium और अंत के लिए .short)। यदि अलग-अलग शैलियों की आवश्यकता है, तो आपको प्रत्येक तिथि को एक अलग DateFormatter से स्वरूपित करना होगा और परिणामों को संयोजित करना होगा।
import Foundation
let formatter = DateIntervalFormatter()
// विभिन्न शैली संयोजन
let startDate = Date()
let endDate = Date().addingTimeInterval(345600) // +4 दिन
let interval = DateInterval(start: startDate, end: endDate)
// केवल तिथि, मध्यम प्रारूप
formatter.dateStyle = .medium
formatter.timeStyle = .none
print("केवल तिथि: \(formatter.string(from: interval))")
// समय के साथ लघु प्रारूप
formatter.dateStyle = .short
formatter.timeStyle = .short
print("समय के साथ लघु: \(formatter.string(from: interval))")
// पूर्ण प्रारूप
formatter.dateStyle = .full
formatter.timeStyle = .none
print("पूर्ण तिथि: \(formatter.string(from: interval))")
मूल उपयोग DateIntervalFormatter में एक इंस्टेंस बनाना, शैलियाँ सेट करना और string(from:) को कॉल करना शामिल है। यह विधि DateInterval स्वीकार करती है, जो start और end गुणों वाली एक संरचना है। DateInterval दो Date मानों से बनाया जा सकता है या Duration (iOS 16+) के साथ आरंभ किया जा सकता है। स्वरूपण के बाद, परिणाम बिना अतिरिक्त प्रसंस्करण के UI प्रदर्शन के लिए तैयार है।
import Foundation
let calendar = Calendar.current
let now = Date()
// विशिष्ट अंतराल उदाहरण
let examples: [(title: String, start: Date, end: Date)] = [
(
"2-hour event",
now,
now.addingTimeInterval(7200)
),
(
"Week-long vacation",
now,
now.addingTimeInterval(604800)
),
(
"Cross-year period",
calendar.date(from: DateComponents(
year: 2024, month: 12, day: 25
))!,
calendar.date(from: DateComponents(
year: 2025, month: 1, day: 5
))!
)
]
let intervalFormatter = DateIntervalFormatter()
intervalFormatter.dateStyle = .medium
intervalFormatter.timeStyle = .short
for (title, start, end) in examples {
let interval = DateInterval(start: start, end: end)
let result = intervalFormatter.string(from: interval)
print("\(title): \(result)")
}
// Calendar के माध्यम से प्रारूप (iOS 16+)
if let nextWeek = calendar.date(
byAdding: .day, value: 7, to: now
) {
let weekInterval = DateInterval(start: now, end: nextWeek)
print("अगले 7 दिन: \(intervalFormatter.string(from: weekInterval))")
}
DateIntervalFormatter और कैलेंडर बुकिंग: बुकिंग अनुप्रयोगों (होटल, टिकट) में, दिनांक अंतराल एक महत्वपूर्ण UI तत्व हैं। DateIntervalFormatter अंतर-वर्ष अंतरालों (उदाहरण के लिए, 28 दिसंबर से 3 जनवरी) को सही ढंग से संभालता है, प्रत्येक तिथि के लिए अलग-अलग महीने और वर्ष को समूहित करता है। ऐसे परिदृश्यों के लिए, dateStyle = .medium और timeStyle = .none का उपयोग करने की अनुशंसा की जाती है, जो बिना समय वाली तिथियों के लिए सबसे पठनीय प्रारूप है।
import Foundation
let formatter = DateIntervalFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none
// बुकिंग उदाहरण
struct Booking {
let checkIn: Date
let checkOut: Date
var formattedInterval: String {
let interval = DateInterval(start: checkIn, end: checkOut)
return formatter.string(from: interval)
}
}
let booking = Booking(
checkIn: calendar.date(from: DateComponents(
year: 2024, month: 7, day: 21
))!,
checkOut: calendar.date(from: DateComponents(
year: 2024, month: 7, day: 25
))!
)
print("बुकिंग: \(booking.formattedInterval)")
// विभिन्न स्थानीय सेटिंग्स के साथ उपयोग
let enFormatter = DateIntervalFormatter()
enFormatter.dateStyle = .medium
enFormatter.timeStyle = .none
enFormatter.locale = Locale(identifier: "en_US")
print("अंग्रेज़ी: \(enFormatter.string(from: interval))")
DateInterval बनाम DateIntervalFormatter: DateInterval एक संरचना है जो एक दिनांक श्रेणी (आरंभ और अंत) का प्रतिनिधित्व करती है। DateIntervalFormatter एक स्वरूपक है जो इस संरचना को एक स्ट्रिंग में परिवर्तित करता है। DateInterval contains(Date) जाँच और intersection(with:) का भी समर्थन करता है, जो बुकिंग तर्क (दिनांक ओवरलैप की जाँच) के लिए उपयोगी है।
DateIntervalFormatter locale गुण के माध्यम से आउटपुट को स्थानीयकृत करता है। डिफ़ॉल्ट रूप से, Locale.current का उपयोग किया जाता है, जो डिवाइस की स्थानीय सेटिंग है। किसी अन्य भाषा में अंतराल प्रदर्शित करने के लिए (उदाहरण के लिए, हिन्दी इंटरफ़ेस के साथ अंग्रेज़ी सामग्री), locale को स्पष्ट रूप से सेट करें। DateFormatter के विपरीत, DateIntervalFormatter को सर्वर-साइड डेटा के लिए locale सेट करने की आवश्यकता नहीं है। यह हमेशा अपने आंतरिक CLDR-आधारित समूहीकरण तर्क का उपयोग करता है।
दिनांक अंतराल स्वरूपण में भाषाई अंतर एकल तिथियों की तुलना में काफी अधिक जटिल होते हैं। हिन्दी “से” पूर्वसर्ग का उपयोग करती है: 21 से 25 जुलाई। अंग्रेज़ी एक सरल डैश का उपयोग करती है: Jul 21–25। फ़्रेंच “au” पूर्वसर्ग का उपयोग करती है: du 21 au 25 juillet। जर्मन संख्या के बाद एक बिंदु और डैश का उपयोग करती है: 21.–25. Juli। DateIntervalFormatter इन सभी विविधताओं को कवर करता है।
import Foundation
let formatter = DateIntervalFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
let start = Date()
let end = Date().addingTimeInterval(259200) // +3 दिन
let interval = DateInterval(start: start, end: end)
// विभिन्न स्थानीय सेटिंग्स प्रदर्शित करें
let localeIds = ["ru_RU", "en_US", "de_DE", "fr_FR", "ja_JP", "zh_CN"]
for localeId in localeIds {
formatter.locale = Locale(identifier: localeId)
print("\(localeId): \(formatter.string(from: interval))")
}
// समय अंतराल के लिए स्थानीयकरण
formatter.dateStyle = .none
formatter.timeStyle = .short
let todayStart = Date()
let todayEnd = Date().addingTimeInterval(3600)
let timeInterval = DateInterval(start: todayStart, end: todayEnd)
for localeId in ["ru_RU", "en_US", "de_DE"] {
formatter.locale = Locale(identifier: localeId)
print("\(localeId) समय: \(formatter.string(from: timeInterval))")
}
स्थानीयकरण विशिष्टताएँ: हिन्दी के लिए, DateIntervalFormatter लंबे प्रारूपों के लिए “से” पूर्वसर्ग का उपयोग करता है। छोटे प्रारूपों के लिए, यह डैश का उपयोग करता है। प्रारूप का चुनाव संदर्भ पर निर्भर करता है: बुकिंग सूची के लिए .medium का उपयोग करें, विस्तृत दृश्य के लिए .long या .full का उपयोग करें।
DateIntervalFormatter दिनांक श्रेणियों को स्वरूपित करने के क्षेत्र को भरता है, जो अन्य Foundation वर्गों द्वारा कवर नहीं किया जाता है। DateFormatter एकल तिथियों को स्वरूपित करता है, RelativeDateTimeFormatter सापेक्ष तिथियों को स्वरूपित करता है (पहले/में), DateComponentsFormatter अवधि को स्वरूपित करता है (2 घंटे 30 मिनट)। ये प्रत्येक वर्ग एक विशिष्ट कार्य को हल करता है और इन्हें एक दूसरे के स्थान पर उपयोग नहीं किया जा सकता है।
| वर्ग | उद्देश्य | आउटपुट उदाहरण |
|---|---|---|
| DateIntervalFormatter | दिनांक श्रेणी | 21–25 जुलाई 2024 |
| DateFormatter | एकल तिथि | 21 जुलाई 2024 |
| RelativeDateTimeFormatter | सापेक्ष समय | 3 दिन पहले |
| DateComponentsFormatter | अवधि | 2 घंटे 30 मिनट |
| ISO8601DateFormatter | ISO 8601 प्रारूप | 2024-07-21T14:30:00Z |
DateIntervalFormatter का उपयोग कब करें: UI में दिनांक श्रेणियाँ प्रदर्शित करने के लिए — होटल बुकिंग, ईवेंट, दिनांक फ़िल्टरिंग, संचालन इतिहास। तिथियों के बीच अवधि की गणना करने के लिए, DateComponentsFormatter का उपयोग करें, DateIntervalFormatter का नहीं, क्योंकि बाद वाला अवधि प्रदर्शित करने के लिए डिज़ाइन नहीं किया गया है। DateFormatter का उपयोग केवल एकल तिथियों के लिए किया जाना चाहिए, न कि स्ट्रिंग संयोजन के माध्यम से दो स्वरूपित तिथियों को जोड़ने के लिए, क्योंकि इससे विभाजक स्थानीयकरण खो जाता है।
एज केस: DateIntervalFormatter खुले अंत वाले अंतरालों (बिना अंतिम तिथि के) को प्रदर्शित करने का समर्थन नहीं करता है। यदि श्रेणी का अंत अज्ञात है (उदाहरण के लिए, “21 जुलाई से”), तो “से” पूर्वसर्ग के साथ DateFormatter का उपयोग करें। साथ ही, DateIntervalFormatter विभिन्न दिनों के लिए निर्दिष्ट समय वाले अंतरालों का समर्थन नहीं करता है। समय प्रत्येक तिथि पर अलग-अलग लागू होता है, जो छोटे अंतरालों के लिए अनावश्यक लग सकता है।
अक्सर पूछे जाने वाले प्रश्न
DateIntervalFormatter Foundation का एक वर्ग है जो दिनांक श्रेणियों को स्थानीयकृत स्ट्रिंग्स में स्वरूपित करता है। iOS 8 से उपलब्ध, यह स्वचालित रूप से दोहराए जाने वाले घटकों (महीना, वर्ष) को समूहित करता है और भाषा के लिए सही विभाजक का चयन करता है।
यह घटकों की तुलना वर्ष से दिन तक करता है। यदि वर्ष मेल खाता है, तो एक बार दिखाया जाता है। यदि महीना मेल खाता है, तो एक बार दिखाया जाता है। भिन्न दिन श्रेणी के रूप में दिखाए जाते हैं। यह “21 जुलाई 2024 – 25 जुलाई 2024” के बजाय “21–25 जुलाई 2024” देता है।
नहीं, विभाजक स्थानीय सेटिंग्स द्वारा निर्धारित होता है और API के माध्यम से अनुकूलित नहीं किया जा सकता है। एक कस्टम विभाजक के लिए (उदाहरण के लिए, “से” के बजाय “तक”), प्रत्येक तिथि को एक अलग DateFormatter से स्वरूपित करें और स्ट्रिंग्स को मैन्युअल रूप से संयोजित करें।
DateIntervalFormatter एक दिनांक श्रेणी (दो तिथियाँ) को घटक समूहीकरण के साथ एक इकाई के रूप में स्वरूपित करता है। DateFormatter एक एकल तिथि को स्वरूपित करता है। श्रेणियों के लिए, हमेशा DateIntervalFormatter का उपयोग करें क्योंकि यह सही विभाजक स्थानीयकरण प्रदान करता है।
स्वचालित रूप से — DateIntervalFormatter पता लगाता है कि वर्ष भिन्न हैं और दोनों छोरों के लिए पूर्ण तिथियाँ प्रदर्शित करता है: “25 दिसंबर 2024 – 5 जनवरी 2025”। किसी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है, बस dateStyle सेट करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें