DateFormatter: मुख्य अवधारणाएँ, दिनांक स्वरूपण और स्थानीयकरण

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

DateFormatter एक Foundation क्लास है जो Date ऑब्जेक्ट्स और उनके स्ट्रिंग प्रतिनिधित्व के बीच द्विदिश रूपांतरण के लिए डिज़ाइन किया गया है। यह क्लास उपयोगकर्ता के लोकेल, समय क्षेत्र और कैलेंडर को ध्यान में रखती है, जो दुनिया के किसी भी क्षेत्र में तिथियों का सही प्रदर्शन सुनिश्चित करती है। Apple Developer Documentation (2025) के अनुसार, DateFormatter चार पूर्वनिर्धारित दिनांक और समय शैलियों के साथ-साथ टेम्पलेट स्ट्रिंग के माध्यम से पूरी तरह से कस्टम फ़ॉर्मेट का समर्थन करता है। DateFormatter के बिना किसी अंतर्राष्ट्रीयकृत एप्लिकेशन में उपयोगकर्ता को सही ढंग से तारीख प्रदर्शित करना असंभव है।

मुख्य बातें

  • DateFormatter — लोकेल और समय क्षेत्र समर्थन के साथ Date को स्ट्रिंग में और वापस बदलने के लिए एक क्लास।
  • dateStyle और timeStyle — त्वरित स्वरूपण के लिए पूर्वनिर्धारित शैलियाँ (.short, .medium, .long, .full)।
  • dateFormat — Unicode LDML प्रतीकों के माध्यम से निर्दिष्ट कस्टम फ़ॉर्मेट के लिए एक टेम्पलेट स्ट्रिंग।
  • Locale और TimeZone — फ़ॉर्मेटर के गुण जो क्षेत्रीय प्रदर्शन और समय क्षेत्र निर्धारित करते हैं।
  • ISO8601DateFormatter — API में सीरियलाइज़ करते समय ISO 8601 फ़ॉर्मेट के लिए एक तेज़ विकल्प।

DateFormatter क्या है?

DateFormatter Foundation फ्रेमवर्क की एक क्लास है जो Date और स्ट्रिंग के बीच द्विदिश रूपांतरण लागू करती है। यह पहली बार OpenStep में NSDateFormatter के रूप में दिखाई दी और तब से सभी Apple प्लेटफ़ॉर्म पर तिथि स्वरूपण का प्राथमिक उपकरण बनी हुई है। यह क्लास Formatter से विरासत प्राप्त करती है और स्थानीयकृत तिथि प्रदर्शन के लिए एक सुविधाजनक API प्रदान करती है।

DateFormatter Unicode LDML पैटर्न के आधार पर काम करता है — वही जो ICU (International Components for Unicode) में उपयोग किए जाते हैं। पैटर्न dateFormat गुण के माध्यम से सेट किया जाता है, जहाँ प्रतीक y, M, d, H, m, s वर्ष, महीने, दिन, घंटे, मिनट, सेकंड के अनुरूप होते हैं। प्रतीक की पुनरावृत्ति फ़ॉर्मेट निर्धारित करती है: "y" — दो अंकों का वर्ष, "yyyy" — चार अंकों का वर्ष।

DateFormatter बनाना एक महँगा ऑपरेशन है, क्योंकि आरंभीकरण के दौरान लोकेल और कैलेंडर डेटा लोड किया जाता है। Apple प्रत्येक स्वरूपण प्रकार के लिए एक बार फ़ॉर्मेटर बनाने और उसे पुनः उपयोग करने की अनुशंसा करता है। SwiftUI और UIKit में, फ़ॉर्मेटर अक्सर स्थैतिक गुणों में कैश किए जाते हैं या पहुँच पर आलसी रूप से बनाए जाते हैं।

iOS SDK में DateFormatter

DateFormatter कई iOS सिस्टम घटकों में उपयोग किया जाता है। UIDatePicker countDownTimer मोड में तिथियाँ प्रदर्शित करने के लिए आंतरिक रूप से DateFormatter का उपयोग करता है। फ़ॉर्मेटर वाला TextField उपयोगकर्ता द्वारा दर्ज की गई तिथियों को स्वचालित रूप से मान्य कर सकता है। Core Data Date प्रकार की विशेषताओं का समर्थन करता है, लेकिन उनका स्ट्रिंग प्रतिनिधित्व हमेशा DateFormatter के माध्यम से किया जाता है।

थ्रेड सुरक्षा — DateFormatter थ्रेड-सुरक्षित नहीं है। विभिन्न थ्रेड्स से फ़ॉर्मेटर के गुणों को संशोधित करना अपरिभाषित व्यवहार की ओर ले जाता है। बहु-थ्रेडेड उपयोग के लिए, प्रत्येक थ्रेड के लिए अलग फ़ॉर्मेटर इंस्टेंस बनाएँ या NSLock या सीरियल क्यू के माध्यम से सिंक्रनाइज़ेशन का उपयोग करें।

DateFormatter स्वरूपण शैलियाँ

dateStyle और timeStyle तिथि प्रदर्शन कॉन्फ़िगर करने के सबसे सरल तरीके हैं। प्रत्येक शैली के चार विकल्प हैं: .short, .medium, .long, .full। dateStyle और timeStyle का संयोजन दिनांक और समय प्रारूप के स्वतंत्र कॉन्फ़िगरेशन की अनुमति देता है, और .none गुण संबंधित भाग को अक्षम करता है।

अमेरिकी लोकेल के लिए, .short तिथि को "7/21/26" के रूप में फ़ॉर्मेट करता है, और रूसी लोकेल के लिए "21.07.2026" के रूप में। रूसी लोकेल के लिए .long शैली "21 जुलाई 2026" आउटपुट करती है, और .full — "मंगलवार, 21 जुलाई 2026" सप्ताह के दिन के साथ। सभी चार शैलियाँ स्वचालित रूप से क्षेत्रीय मानकों के अनुकूल हो जाती हैं, जिसमें घटक क्रम और विभाजक शामिल हैं।

SFDateFormatter iOS 15+ में RelativeDateFormatter और DateIntervalFormatter के माध्यम से एक वैकल्पिक दृष्टिकोण प्रदान करता है। RelativeDateFormatter संदर्भ के लिए "आज", "कल", "3 दिनों में" आउटपुट करता है। DateIntervalFormatter तिथि श्रेणियाँ प्रदर्शित करता है: "21–25 जुलाई 2026" — बुकिंग और योजना के लिए।

शैलीउदाहरण (ru_RU)उदाहरण (en_US)
.short21.07.20267/21/26
.medium21 जुल॰ 2026Jul 21, 2026
.long21 जुलाई 2026July 21, 2026
.fullमंगलवार, 21 जुलाई 2026Tuesday, July 21, 2026

शैलियों को संयोजित करते समय, DateFormatter स्वचालित रूप से विभाजक चुनता है: .short.date + .short.time के लिए परिणाम "21.07.2026, 14:30" हो सकता है। .full.date + .full.time के लिए — "मंगलवार, 21 जुलाई 2026, 14:30:00 MSK"। विभाजक लोकेल द्वारा प्रबंधित किया जाता है, डेवलपर द्वारा नहीं — यह उपयोगकर्ता की क्षेत्रीय अपेक्षाओं के अनुपालन को सुनिश्चित करता है।

dateFormat के माध्यम से कस्टम फ़ॉर्मेट

dateFormat Unicode LDML विनिर्देश प्रतीकों का उपयोग करके एक मनमाना स्वरूपण पैटर्न सेट करने की अनुमति देता है। यह प्रदर्शन पर पूर्ण नियंत्रण देता है: आप केवल वर्ष और महीना दिखा सकते हैं, या तारीख के बिना सप्ताह का दिन, या सेकंड के बिना समय। कस्टम फ़ॉर्मेट विशिष्ट डिज़ाइन आवश्यकताओं के लिए अपरिहार्य है।

मुख्य प्रतीक — yyyy (वर्ष: 2026), MM (महीना: 07), dd (दिन: 21), HH (घंटे: 14), mm (मिनट: 30), ss (सेकंड: 00)। पूरे महीने के नाम के लिए MMMM (जुलाई) का उपयोग करें, संक्षिप्त के लिए — MMM (जुल.)। सप्ताह का दिन — EEEE (मंगलवार), संक्षिप्त — E (मंगल)।

dateFormat का उपयोग करते समय फ़ॉर्मेटर का लोकेल सेट करना महत्वपूर्ण है। यदि लोकेल सेट नहीं है, तो फ़ॉर्मेटर सिस्टम लोकेल का उपयोग करता है, जो API में एक निश्चित प्रारूप के लिए अवांछनीय हो सकता है। Apple एक निश्चित अंतर-क्षेत्रीय प्रारूप के लिए locale = Locale(identifier: "en_US_POSIX") सेट करने की अनुशंसा करता है, विशेष रूप से सर्वर प्रतिक्रियाओं से तिथियों को पार्स करते समय।

swift
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.dateFormat = "d MMMM yyyy"
let customString = formatter.string(from: Date())
// "21 July 2026"

// कस्टम स्ट्रिंग पार्स करना
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = formatter.date(from: "2026-07-21 14:30:00")!

dateFormat में त्रुटि एप्लिकेशन क्रैश के सामान्य कारणों में से एक है। यदि प्रारूप स्ट्रिंग से मेल नहीं खाता है, तो date(from:) विधि nil लौटाती है। सुरक्षित वैकल्पिक अनरैपिंग के लिए guard let या ?? का उपयोग करें। प्रारूप को मान्य करने के लिए, इसे सभी समर्थित भाषाओं पर परीक्षण करें — कुछ LDML प्रतीक विभिन्न लोकेल में अलग तरह से काम करते हैं।

स्थानीयकरण और TimeZone

Locale यह निर्धारित करता है कि महीनों, सप्ताह के दिनों के नाम और कौन से विभाजक उपयोग किए जाते हैं। DateFormatter डिफ़ॉल्ट रूप से Locale.current का उपयोग करता है, लेकिन कुछ परिदृश्यों में एक विशिष्ट लोकेल निर्दिष्ट करने की आवश्यकता होती है: लॉग में एक निश्चित प्रारूप के लिए en_US_POSIX का उपयोग करें, सर्वर तिथियों के लिए — सर्वर से मेल खाने वाला लोकेल।

TimeZone गुण प्रदर्शन के लिए समय क्षेत्र निर्धारित करता है। डिफ़ॉल्ट रूप से सिस्टम समय क्षेत्र का उपयोग किया जाता है, लेकिन अंतर्राष्ट्रीय दर्शकों वाले एप्लिकेशन के लिए अक्सर उपयोगकर्ता के समय क्षेत्र या UTC में तिथियाँ प्रदर्शित करने की आवश्यकता होती है। timeZone बदलने से केवल प्रदर्शन प्रभावित होता है — Date मान अपरिवर्तित रहता है।

एक महत्वपूर्ण विशेषता: यदि DateFormatter का उपयोग स्ट्रिंग को पार्स करने के लिए किया जाता है और स्ट्रिंग में समय क्षेत्र का संकेत है (उदाहरण के लिए, UTC के लिए Z के साथ "2026-07-21T14:30:00Z"), तो timeZone गुण को अनदेखा किया जाता है — फ़ॉर्मेटर स्ट्रिंग से समय क्षेत्र का उपयोग करता है। यदि स्ट्रिंग में समय क्षेत्र अनुपस्थित है, तो फ़ॉर्मेटर का timeZone लागू होता है।

swift
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.timeZone = TimeZone(identifier: "Europe/Moscow")
formatter.dateStyle = .long
formatter.timeStyle = .short

let moscowTime = formatter.string(from: Date())
// "21 July 2026, 14:30"

// स्ट्रिंग में बिना समय क्षेत्र के पार्स करना
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let utcDate = formatter.date(from: "2026-07-21 10:30")!

AutoupdatingCurrentLocale — एक विशेष लोकेल प्रकार जो उपयोगकर्ता की सिस्टम सेटिंग्स बदलने पर स्वचालित रूप से अपडेट होता है। DateFormatter डिफ़ॉल्ट रूप से इसका समर्थन करता है। यदि एप्लिकेशन बैकग्राउंड में चल रहा है और उपयोगकर्ता सिस्टम भाषा बदलता है, तो परिवर्तन से पहले बनाया गया फ़ॉर्मेटर पुराने लोकेल का उपयोग जारी रखेगा — अपडेट करने के लिए एक नया इंस्टेंस बनाने की आवश्यकता है।

ISO8601DateFormatter और विकल्प

ISO8601DateFormatter ISO 8601 प्रारूप में तिथियों के साथ काम करने के लिए एक विशेष फ़ॉर्मेटर है। यह प्रारूप REST API, JSON और डेटा आदान-प्रदान के लिए वास्तविक मानक है। ISO8601DateFormatter DateFormatter की तुलना में काफी तेज़ काम करता है क्योंकि यह लोकेल पर निर्भर नहीं करता है और एक निश्चित पार्सिंग व्याकरण का उपयोग करता है।

मुख्य फ़ॉर्मेटर विकल्प — .withInternetDateTime (2026-07-21T14:30:00Z), .withFractionalSeconds (मिलीसेकंड जोड़ता है), .withTimeZone (समय क्षेत्र ऑफ़सेट शामिल करता है)। विकल्पों को संयोजित करके आप कोई भी ISO 8601 प्रकार प्राप्त कर सकते हैं: मिलीसेकंड के साथ, समय क्षेत्र के साथ, केवल तिथि के साथ।

JSONEncoder.DateEncodingStrategy सभी Codable मॉडलों के लिए वैश्विक रूप से तिथि एन्कोडिंग कॉन्फ़िगर करने की अनुमति देता है। विकल्प — .iso8601 (ISO8601DateFormatter का उपयोग करता है), .formatted(DateFormatter), .millisecondsSince1970, .secondsSince1970। रणनीति का चुनाव संपूर्ण सीरियलाइज़ेशन जीवनचक्र को प्रभावित करता है और सभी API एंडपॉइंट्स में एकरूप होना चाहिए।

swift
// ISO8601DateFormatter
let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let isoString = isoFormatter.string(from: Date())
// "2026-07-21T14:30:00.000Z"

// ISO8601 के साथ JSONEncoder
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601

// वैकल्पिक: कस्टम फ़ॉर्मेटर के साथ JSONEncoder
let customEncoder = JSONEncoder()
customEncoder.dateEncodingStrategy = .formatted(myFormatter)

DateFormatter बनाम ISO8601DateFormatter — API में तिथियों को सीरियलाइज़ और पार्स करने के लिए ISO8601DateFormatter चुनें, क्योंकि यह DateFormatter से 5-10 गुना तेज़ है और स्थानीयकरण त्रुटियों के लिए प्रवण नहीं है। DateFormatter को उपयोगकर्ता इंटरफ़ेस के लिए छोड़ दें जहाँ उपयोगकर्ता की मूल भाषा में महीने और दिन के नामों के साथ स्थानीयकृत प्रदर्शन आवश्यक है।

दिनांक स्वरूपण उदाहरण

आइए iOS एप्लिकेशन में DateFormatter के उपयोग के वास्तविक परिदृश्यों पर नज़र डालें: समाचार फ़ीड में तिथियाँ प्रदर्शित करना, जन्म तिथि दर्ज करना और विभिन्न समय क्षेत्रों में तिथियों के साथ रिपोर्ट निर्यात करना।

सूची में समाचार तिथि प्रदर्शित करना

RelativeDateFormatter समाचार फ़ीड के लिए सर्वोत्तम है। यह ताज़ा समाचारों के लिए "अभी", "5 मिनट पहले", "कल" प्रदर्शित करता है और पुराने समाचारों के लिए पूर्ण तिथि पर स्विच करता है। स्विच थ्रेशोल्ड कैलेंडर के माध्यम से कॉन्फ़िगर किया जाता है: समाचारों के लिए 24 घंटे की सीमा का उपयोग करें, मैसेंजर के लिए — एक सप्ताह।

swift
func formatRelativeDate(_ date: Date) -> String {
    let relative = RelativeDateFormatter()
    relative.unitsStyle = .full

    let formatter = DateFormatter()
    formatter.dateStyle = .medium
    formatter.timeStyle = .short

    let daysDiff = Calendar.current.dateComponents(
        [.day], from: date, to: Date()
    ).day ?? 0

    return daysDiff < 1
        ? relative.localizedString(for: date, relativeTo: Date())
        : formatter.string(from: date)
}

जन्म तिथि दर्ज करना — एक और सामान्य परिदृश्य। DateFormatter एक विशिष्ट dateFormat "dd.MM.yyyy" और locale "ru_RU" के साथ कॉन्फ़िगर किया जाता है। दर्ज की गई स्ट्रिंग को पार्स करते समय संभावित त्रुटियों को संभालना महत्वपूर्ण है: फ़ॉर्मेटर अमान्य स्ट्रिंग के लिए nil लौटाता है। सफल पार्सिंग के बाद, तिथि की जाँच की जाती है कि वह स्वीकार्य सीमा के भीतर है — 1900 से पहले नहीं, आज से बाद में नहीं।

तिथियों के साथ रिपोर्ट निर्यात करना के लिए उपयोगकर्ता के लोकेल से स्वतंत्र एक निश्चित प्रारूप की आवश्यकता होती है। locale en_US_POSIX और समय क्षेत्र UTC के साथ dateFormat "yyyy-MM-dd HH:mm:ss" का उपयोग करें। यह दृष्टिकोण गारंटी देता है कि फ़ाइल सिस्टम की क्षेत्रीय सेटिंग्स की परवाह किए बिना किसी भी देश में सही ढंग से खुलेगी।

परिदृश्यफ़ॉर्मेटरमुख्य सेटिंग
समाचार फ़ीडRelativeDateFormatterunitsStyle = .full
तिथि इनपुटDateFormatterdateFormat + फ़ॉलबैक
API सीरियलाइज़ेशनISO8601DateFormatterwithInternetDateTime
रिपोर्ट निर्यातDateFormatteren_US_POSIX + UTC

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

DateFormatter एक मान्य स्ट्रिंग के लिए nil क्यों लौटाता है?

सबसे सामान्य कारण — dateFormat और स्ट्रिंग प्रारूप के बीच बेमेल। उदाहरण के लिए, प्रारूप "dd.MM.yyyy" स्ट्रिंग "2026-07-21" को पार्स नहीं करेगा। दूसरा कारण — लोकेल बेमेल: स्ट्रिंग "July 21, 2026" ru_RU लोकेल के साथ पार्स नहीं होगी। तीसरा — LDML प्रतीकों में टाइपो: yyyy का उपयोग करें, YYYY नहीं (अलग अर्थ)।

क्या प्रत्येक कॉल के लिए नया DateFormatter बनाना चाहिए?

नहीं। DateFormatter एक भारी ऑब्जेक्ट है, इसके आरंभीकरण में लोकेल डेटा लोड करना शामिल है। प्रति स्वरूपण प्रकार एक इंस्टेंस बनाएँ और इसे पुनः उपयोग करें। बहु-थ्रेडेड वातावरण में, थ्रेड-लोकल स्टोरेज या सिंक्रनाइज़ेशन के लिए सीरियल क्यू के साथ फ़ॉर्मेटर पूल का उपयोग करें।

DateFormatter, RelativeDateFormatter से कैसे भिन्न है?

DateFormatter एक निरपेक्ष तिथि प्रदर्शित करता है (21 जुलाई 2026), जबकि RelativeDateFormatter एक सापेक्ष तिथि प्रदर्शित करता है (आज, कल, 3 दिनों में)। RelativeDateFormatter iOS 15+ में पेश किया गया था और यह उसी LDML टेम्पलेट का उपयोग करता है लेकिन स्वचालित रूप से सापेक्ष प्रदर्शन का चयन करता है।

API से बिना समय क्षेत्र वाली तिथियों को कैसे संभालें?

पार्स करने से पहले फ़ॉर्मेटर का timeZone UTC पर सेट करें। यदि सर्वर समय क्षेत्र संकेत के बिना स्थानीय समय में तिथि लौटाता है, तो API विनिर्देश की जाँच करें — सबसे अधिक संभावना है कि UTC का अर्थ है। अंत में Z के साथ ISO 8601 के लिए, timeZone की आवश्यकता नहीं है — फ़ॉर्मेटर स्ट्रिंग से ऑफ़सेट पार्स करता है।

DateFormatter को थ्रेड-सुरक्षित कैसे बनाएँ?

बिना सिंक्रनाइज़ेशन के विभिन्न थ्रेड्स से एक इंस्टेंस का उपयोग न करें। प्रत्येक थ्रेड में एक नया इंस्टेंस बनाएँ या भंडारण के लिए Thread.current.threadDictionary का उपयोग करें। एक विकल्प string(from:) और date(from:) की अवधि के लिए लॉकिंग के साथ NSLock है।

सारांश

  • DateFormatter — लोकेल, समय क्षेत्र और कैलेंडर समर्थन के साथ Date को स्ट्रिंग में और वापस बदलने के लिए एक Foundation क्लास।
  • पूर्वनिर्धारित शैलियाँ dateStyle और timeStyle .short, .medium, .long, .full विकल्पों के साथ अधिकांश UI परिदृश्यों को कवर करती हैं।
  • कस्टम dateFormat LDML प्रतीकों के माध्यम से प्रारूप पर पूर्ण नियंत्रण देता है लेकिन स्थानीयकरण के साथ सावधानी की आवश्यकता है।
  • Locale और TimeZone — सही प्रदर्शन के लिए आवश्यक गुण: UI के लिए — सिस्टम लोकेल, API के लिए — en_US_POSIX और UTC।
  • ISO8601DateFormatter — गति और स्थिरता के कारण API में तिथि सीरियलाइज़ेशन के लिए पसंदीदा विकल्प।
  • DateFormatter थ्रेड-सुरक्षित नहीं है — प्रत्येक थ्रेड के लिए अलग इंस्टेंस का उपयोग करें या पहुँच को सिंक्रनाइज़ करें।
  • RelativeDateFormatter (iOS 15+) — समाचार फ़ीड और मैसेंजर में सापेक्ष तिथियाँ प्रदर्शित करने के लिए सर्वोत्तम समाधान।

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

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

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

यह भी पढ़ें