DateIntervalFormatter — दिनांक अंतराल स्वरूपण की मूल बातें

लेखक: IT Sectr प्रकाशित: 2026-07-13 पढ़ने का समय: 11 मिनट

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 वर्ग (iOS 8+)
  • स्वचालित समूहीकरण — दोहराए जाने वाले घटक (महीना, वर्ष) एक बार दिखाए जाते हैं
  • स्थानीयकृत विभाजक — व्याकरणिक नियम: “से” (हिन्दी), डैश (अंग्रेज़ी)
  • पाँच दिनांक शैलियाँ — .none, .short, .medium, .long, .full श्रेणी के प्रत्येक छोर के लिए
  • चार समय शैलियाँ — श्रेणी के समय भाग के लिए समान विस्तार स्तर

DateIntervalFormatter क्या है?

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 डेवलपर की ओर से अतिरिक्त कोड के बिना इन सभी विविधताओं को कवर करता है।

Foundation में 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 = .medium, timeStyle = .none — केवल तिथि: “21–25 जुलाई 2024”
  • dateStyle = .short, timeStyle = .short — तिथि और समय: “21/07/2024, 14:30 – 25/07/2024, 16:45”
  • dateStyle = .none, timeStyle = .short — केवल समय: “14:30–16:45” (यदि तिथियाँ समान हैं)
  • dateStyle = .long, timeStyle = .none — लंबी तिथि: “21–25 जुलाई 2024”
  • dateStyle = .full, timeStyle = .short — पूर्ण प्रारूप: “रविवार, 21 जुलाई 2024 – गुरुवार, 25 जुलाई 2024”

महत्वपूर्ण: dateStyle और timeStyle श्रेणी के दोनों छोरों पर समान रूप से लागू होते हैं। आप शुरुआत और अंत के लिए अलग-अलग शैलियाँ सेट नहीं कर सकते (उदाहरण के लिए, शुरुआत के लिए .medium और अंत के लिए .short)। यदि अलग-अलग शैलियों की आवश्यकता है, तो आपको प्रत्येक तिथि को एक अलग DateFormatter से स्वरूपित करना होगा और परिणामों को संयोजित करना होगा।

swift
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))")

Swift में DateIntervalFormatter: उदाहरण

मूल उपयोग DateIntervalFormatter में एक इंस्टेंस बनाना, शैलियाँ सेट करना और string(from:) को कॉल करना शामिल है। यह विधि DateInterval स्वीकार करती है, जो start और end गुणों वाली एक संरचना है। DateInterval दो Date मानों से बनाया जा सकता है या Duration (iOS 16+) के साथ आरंभ किया जा सकता है। स्वरूपण के बाद, परिणाम बिना अतिरिक्त प्रसंस्करण के UI प्रदर्शन के लिए तैयार है।

swift
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 का उपयोग करने की अनुशंसा की जाती है, जो बिना समय वाली तिथियों के लिए सबसे पठनीय प्रारूप है।

swift
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 इन सभी विविधताओं को कवर करता है।

swift
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 मिनट
ISO8601DateFormatterISO 8601 प्रारूप2024-07-21T14:30:00Z

DateIntervalFormatter का उपयोग कब करें: UI में दिनांक श्रेणियाँ प्रदर्शित करने के लिए — होटल बुकिंग, ईवेंट, दिनांक फ़िल्टरिंग, संचालन इतिहास। तिथियों के बीच अवधि की गणना करने के लिए, DateComponentsFormatter का उपयोग करें, DateIntervalFormatter का नहीं, क्योंकि बाद वाला अवधि प्रदर्शित करने के लिए डिज़ाइन नहीं किया गया है। DateFormatter का उपयोग केवल एकल तिथियों के लिए किया जाना चाहिए, न कि स्ट्रिंग संयोजन के माध्यम से दो स्वरूपित तिथियों को जोड़ने के लिए, क्योंकि इससे विभाजक स्थानीयकरण खो जाता है।

एज केस: DateIntervalFormatter खुले अंत वाले अंतरालों (बिना अंतिम तिथि के) को प्रदर्शित करने का समर्थन नहीं करता है। यदि श्रेणी का अंत अज्ञात है (उदाहरण के लिए, “21 जुलाई से”), तो “से” पूर्वसर्ग के साथ DateFormatter का उपयोग करें। साथ ही, DateIntervalFormatter विभिन्न दिनों के लिए निर्दिष्ट समय वाले अंतरालों का समर्थन नहीं करता है। समय प्रत्येक तिथि पर अलग-अलग लागू होता है, जो छोटे अंतरालों के लिए अनावश्यक लग सकता है।

अक्सर पूछे जाने वाले प्रश्न

DateIntervalFormatter क्या है?

DateIntervalFormatter Foundation का एक वर्ग है जो दिनांक श्रेणियों को स्थानीयकृत स्ट्रिंग्स में स्वरूपित करता है। iOS 8 से उपलब्ध, यह स्वचालित रूप से दोहराए जाने वाले घटकों (महीना, वर्ष) को समूहित करता है और भाषा के लिए सही विभाजक का चयन करता है।

DateIntervalFormatter तिथियों को कैसे समूहित करता है?

यह घटकों की तुलना वर्ष से दिन तक करता है। यदि वर्ष मेल खाता है, तो एक बार दिखाया जाता है। यदि महीना मेल खाता है, तो एक बार दिखाया जाता है। भिन्न दिन श्रेणी के रूप में दिखाए जाते हैं। यह “21 जुलाई 2024 – 25 जुलाई 2024” के बजाय “21–25 जुलाई 2024” देता है।

क्या मैं श्रेणी विभाजक बदल सकता हूँ?

नहीं, विभाजक स्थानीय सेटिंग्स द्वारा निर्धारित होता है और API के माध्यम से अनुकूलित नहीं किया जा सकता है। एक कस्टम विभाजक के लिए (उदाहरण के लिए, “से” के बजाय “तक”), प्रत्येक तिथि को एक अलग DateFormatter से स्वरूपित करें और स्ट्रिंग्स को मैन्युअल रूप से संयोजित करें।

DateIntervalFormatter, DateFormatter से कैसे अलग है?

DateIntervalFormatter एक दिनांक श्रेणी (दो तिथियाँ) को घटक समूहीकरण के साथ एक इकाई के रूप में स्वरूपित करता है। DateFormatter एक एकल तिथि को स्वरूपित करता है। श्रेणियों के लिए, हमेशा DateIntervalFormatter का उपयोग करें क्योंकि यह सही विभाजक स्थानीयकरण प्रदान करता है।

अलग-अलग वर्षों वाले अंतराल को कैसे स्वरूपित करें?

स्वचालित रूप से — DateIntervalFormatter पता लगाता है कि वर्ष भिन्न हैं और दोनों छोरों के लिए पूर्ण तिथियाँ प्रदर्शित करता है: “25 दिसंबर 2024 – 5 जनवरी 2025”। किसी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है, बस dateStyle सेट करें।

सारांश

  • DateIntervalFormatter — दिनांक श्रेणियों को स्वरूपित करने के लिए विशेष वर्ग (iOS 8+)
  • स्वचालित समूहीकरण — दोहराए जाने वाले घटक (वर्ष, महीना) पूरी श्रेणी के लिए एक बार दिखाए जाते हैं
  • स्थानीयकृत विभाजक — “से” (हिन्दी), “bis” (जर्मन) स्वचालित रूप से
  • दिनांक और समय शैलियाँ — .none, .short, .medium, .long, .full के संयोजन श्रेणी के प्रत्येक छोर के लिए
  • अवधि के लिए नहीं — अवधि की गणना के लिए DateComponentsFormatter का उपयोग करें
  • कोई कस्टम विभाजक नहीं — गैर-मानक मामलों के लिए मैन्युअल स्वरूपण आवश्यक है
  • DateInterval के साथ एकीकरण — DateInterval संरचना contains और intersection जाँच प्रदान करती है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें