DateIntervalFormatter — asoslar, sana intervallarini formatlash

Muallif: IT Sectr Nashr etilgan: 2026-07-13 O'qish vaqti: 11 daq

DateIntervalFormatter iOS va macOS-da Foundation sinfi bo‘lib, sana diapazonlarini lokalizatsiyalangan satrlarga formatlash uchun mo‘ljallangan: “21–25 iyul 2024”, “21 iyuldan 25 iyulgacha 2024” yoki “Jul 21–25, 2024”. Apple Developer Documentation, 2024-ga ko‘ra, DateIntervalFormatter avtomatik ravishda sananing qaysi komponentlarini takrorlashni aniqlaydi (agar diapazon bir oy ichida bo‘lsa — oy bir marta ko‘rsatiladi) va ajratgichlar hamda so‘z tartibini lokalizatsiyalaydi. Ikki formatlangan sanani qo‘lda yopishtirishdan farqli o‘laroq, bu sinif tilning grammatik qoidalarini hisobga oladi: o‘zbek tili uchun — “dan” va “gacha”, ingliz tili uchun — chiziqcha. Sinif iOS 8 va macOS 10.10 dan boshlab mavjud.

Asosiy ma’lumotlar

  • DateIntervalFormatter — sana diapazonlarini formatlash uchun Foundation sinfi (iOS 8+)
  • Avtomatik guruhlash — takrorlanuvchi komponentlar (oy, yil) bir marta ko‘rsatiladi
  • Lokalizatsiyalangan ajratgichlar — grammatik qoidalarni hisobga olish: “dan–gacha” (o‘zbek), chiziqcha (ingliz)
  • Uchta sana uslubi — .none, .short, .medium, .long, .full diapazonning har ikki uchi uchun
  • To‘rtta vaqt uslubi — diapazonning vaqt qismi uchun bir xil tafsilot darajalari

DateIntervalFormatter nima?

DateIntervalFormatter Foundation-da Formatter-ning osti sinfi bo‘lib, DateInterval obyektini (ikki sana orasidagi diapazon) qabul qiladi va bu diapazonning tavsifi bilan lokalizatsiyalangan satr qaytaradi. Masalan, 21 iyuldan 25 iyulgacha 2024 diapazoni uchun natija o‘z_uz üçün “21–25 iyul 2024” va en_US üçün “Jul 21–25, 2024” bo‘ladi. Sinif takrorlanuvchi elementlarni aqlli guruhlaydi: agar ikkala sana bir oyda bo‘lsa, oy nomi bir marta ko‘rsatiladi.

DateIntervalFormatter-ning asosiy qiymati diapazonlar grammatikasini avtomatik qayta ishlashdir. Qo‘lda formatlashda dasturchi boshlanish va tugash oyini/yilini solishtirishi, ajratgichni tanlashi (chiziqcha, “dan–gacha”, “to”, “bis”) va kelishikni kuzatishi kerak bo‘ladi. DateIntervalFormatter buni CLDR (Common Locale Data Repository) ma’lumotlari asosida avtomatik qiladi, bu esa xalqaro ilovalarda, ayniqsa murakkab grammatikaga ega tillarda xatolar sonini kamaytiradi.

Unicode CLDR v44 (2024)-ga ko‘ra, sana diapazonlarini formatlash qoidalari tillar orasida sezilarli farqlanadi. Nemis tili “bis” old ko‘makchisidan (21.–25. Juli 2024), fransuz tili — “au” (du 21 au 25 juillet 2024), yapon tili — defisdan foydalanadi (2024 Jul 21–25). DateIntervalFormatter bu variantlarning barchasini dasturchi tomonidan qo‘shimcha kod yozilmasdan qamrab oladi.

DateIntervalFormatter Foundation-da qanday ishlaydi?

Ishlash prinsipi DateIntervalFormatter diapazonni tashkil etuvchi ikki sanani tahlil qilish va locale-ni hisobga olgan holda optimal matn ko‘rinishini tanlashga asoslanadi. Sinif sana komponentlarini (yil, oy, kun) solishtiradi va guruhlash haqida qaror qabul qiladi: agar yil bir xil bo‘lsa — bir marta ko‘rsatiladi; agar oy bir xil bo‘lsa — bir marta ko‘rsatiladi; agar kunlar farq qilsa — kun diapazoni ko‘rsatiladi.

Diapazonuz_UZen_US
Bir kun21 iyul 2024Jul 21, 2024
Oy ichida21–25 iyul 2024Jul 21–25, 2024
Turli oylar21 iyul – 5 avgust 2024Jul 21 – Aug 5, 2024
Turli yillar25 dekabr 2024 – 5 yanvar 2025Dec 25, 2024 – Jan 5, 2025
Vaqt bilan21 iyul 2024, 14:30–16:45Jul 21, 2024, 2:30–4:45 PM

Guruhlash mantig‘i CLDR namunalari asosida amalga oshiriladi. Formatlagich har bir sana komponentining (Calendar.Component: year, month, day) tengligini kattadan kichikka qarab tekshiradi. Komponent farqlanishi bilanoq, barcha kichik komponentlar ikkala sana uchun ko‘rsatiladi. Masalan, 21–25 iyul: yil mos, oy mos, kun farqli → oy bir marta, kunlar har bir sana uchun alohida ko‘rsatiladi.

Muhim nuance: DateIntervalFormatter API orqali ajratgichni sozlashni qo‘llab-quvvatlamaydi. Ajratgich locale tomonidan aniqlanadi va o‘zgartirib bo‘lmaydi. Agar maxsus ajratgich kerak bo‘lsa (masalan, “gacha” o‘rniga “–”), sanalarni DateFormatter orqali qo‘lda formatlab, satrlarni maxsus ajratgich bilan yopishtirishingiz kerak bo‘ladi.

Intervallarni formatlash uslublari

DateIntervalFormatter ikki uslub to‘plamini taqdim etadi: dateStyle va timeStyle — diapazonning har ikki uchi uchun. Bu uslublar DateFormatter-ga o‘xshash ishlaydi: .none komponentni yashiradi, .short qisqa format beradi (21.07.2024), .medium — o‘rta (21 iyul 2024), .long — to‘liq (21 iyul 2024), .full — maksimal tafsilotli (yakshanba, 21 iyul 2024). dateStyle va timeStyle-ni birlashtirib, turli tafsilot darajalarini olish mumkin.

Uslub kombinatsiyalari misollari

  • dateStyle = .medium, timeStyle = .none — faqat sana: “21–25 iyul 2024”
  • dateStyle = .short, timeStyle = .short — sana va vaqt: “21.07.2024, 14:30 – 25.07.2024, 16:45”
  • dateStyle = .none, timeStyle = .short — faqat vaqt: “14:30–16:45” (agar sanalar bir xil bo‘lsa)
  • dateStyle = .long, timeStyle = .none — uzun sana: “21–25 iyul 2024 yil”
  • dateStyle = .full, timeStyle = .short — to‘liq format: “yakshanba, 21 iyul 2024 – payshanba, 25 iyul 2024”

Muhim: dateStyle va timeStyle diapazonning ikkala uchiga bir xil qo‘llaniladi. Boshlanish va tugash uchun turli uslub o‘rnatib bo‘lmaydi (masalan, boshlanish uchun .medium, tugash uchun .short). Agar turli uslub kerak bo‘lsa, har bir sanani alohida DateFormatter bilan formatlab, natijalarni yopishtirish kerak.

swift
import Foundation

let formatter = DateIntervalFormatter()

// Turli uslub kombinatsiyalari
let startDate = Date()
let endDate = Date().addingTimeInterval(345600) // +4 kun
let interval = DateInterval(start: startDate, end: endDate)

// Faqat sana, o‘rta format
formatter.dateStyle = .medium
formatter.timeStyle = .none
print("Faqat sana: \(formatter.string(from: interval))")

// Vaqt bilan qisqa format
formatter.dateStyle = .short
formatter.timeStyle = .short
print("Vaqt bilan qisqa: \(formatter.string(from: interval))")

// To‘liq format
formatter.dateStyle = .full
formatter.timeStyle = .none
print("To‘liq sana: \(formatter.string(from: interval))")

DateIntervalFormatter Swift-da: misollar

Asosiy foydalanish DateIntervalFormatter-ni yaratish, uslublarni sozlash va string(from:) chaqirishni o‘z ichiga oladi. Metod start va end xususiyatlariga ega DateInterval strukturasini qabul qiladi. DateInterval ikkala Date-dan ham, Duration bilan (iOS 16+) ham yaratilishi mumkin. Formatlashdan so‘ng natija qo‘shimcha ishlovsiz UI-da ko‘rsatishga tayyor.

swift
import Foundation

let calendar = Calendar.current
let now = Date()

// Aniq intervallar misollari
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 orqali formatlash (iOS 16+)
if let nextWeek = calendar.date(
    byAdding: .day, value: 7, to: now
) {
    let weekInterval = DateInterval(start: now, end: nextWeek)
    print("Keyingi 7 kun: \(intervalFormatter.string(from: weekInterval))")
}

DateIntervalFormatter va Calendar Booking: bron qilish ilovalarida (mehmonxonalar, chiptalar) sana diapazonlari UI-ning asosiy elementidir. DateIntervalFormatter yillararo diapazonlarni to‘g‘ri qayta ishlaydi (masalan, 28 dekabrdan 3 yanvargacha), oy va yilni har bir sana uchun alohida guruhlab. Bunday stsenariylar uchun dateStyle = .medium va timeStyle = .none ishlatish tavsiya etiladi — vaqtsiz sanalar uchun eng o‘qiladigan format.

swift
import Foundation

let formatter = DateIntervalFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none

// Bron qilish misollari
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("Bron: \(booking.formattedInterval)")

// Turli locale-lar bilan foydalanish
let enFormatter = DateIntervalFormatter()
enFormatter.dateStyle = .medium
enFormatter.timeStyle = .none
enFormatter.locale = Locale(identifier: "en_US")
print("Ingliz: \(enFormatter.string(from: interval))")

DateInterval vs DateIntervalFormatter: DateInterval — sana diapazonini ifodalovchi struktur (boshlanish va tugash). DateIntervalFormatter — bu strukturani satrga aylantiruvchi formatlagich. DateInterval shuningdek contains(Date) va intersection(with:) tekshirishlarini qo‘llab-quvvatlaydi, bu bron qilish mantig‘i uchun foydali (sanalarning kesishishini tekshirish).

Sana intervallarini lokalizatsiyalash

DateIntervalFormatter chiqishni locale xususiyati orqali lokalizatsiyalaydi. Standart sifatida Locale.current — qurilmaning locale-i ishlatiladi. Intervallarni boshqa tilda ko‘rsatish uchun (masalan, o‘zbek interfeysida ingliz mazmuni), locale-ni aniq belgilang. DateFormatter-dan farqli o‘laroq, DateIntervalFormatter server ma’lumotlari uchun Locale o‘rnatishni talab qilmaydi — u har doim CLDR-ga asoslangan ichki guruhlash mantig‘idan foydalanadi.

Sana diapazonlarini formatlashda til farqlari yakka sanalarga qaraganda ancha murakkab. Ingliz tili oddiy chiziqchadan foydalanadi: Jul 21–25. O‘zbek tili — “dan–gacha”: 21 dan 25 gacha iyul. Fransuz tili — “au”: du 21 au 25 juillet. Nemis tili — raqamdan keyin nuqta va chiziqcha: 21.–25. Juli. Yapon tili — old ko‘makchisiz defis: Jul 21–25. DateIntervalFormatter bu variantlarning barchasini qamrab oladi.

swift
import Foundation

let formatter = DateIntervalFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none

let start = Date()
let end = Date().addingTimeInterval(259200) // +3 kun
let interval = DateInterval(start: start, end: end)

// Turli locale-larni namoyish qilish
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))")
}

// Vaqt intervallari uchun lokalizatsiya
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) vaqt: \(formatter.string(from: timeInterval))")
}

Lokalizatsiya xususiyatlari: o‘zbek tili uchun DateIntervalFormatter uzun sana formatlarida “dan” va “gacha” old ko‘makchilaridan foydalanadi. Qisqa (short) format uchun — faqat chiziqcha: 21.07–25.07.2024. To‘liq format (full) uchun — hafta kuni bilan. Formatni tanlash kontekstga bog‘liq: bron qilish ro‘yxati uchun .medium, batafsil ko‘rinish uchun .long yoki .full ishlating.

Boshqa sana formatlagichlari bilan solishtirish

DateIntervalFormatter Foundation-ning boshqa sinflari qamrab olmaydigan sana diapazonlarini formatlash joyini egallaydi. DateFormatter yakka sanalarni, RelativeDateTimeFormatter — nisbiy sanalarni (avval/keyin), DateComponentsFormatter — muddatni (2 soat 30 daqiqa) formatlaydi. Bu sinflarning har biri o‘z vazifasini hal qiladi va ularni bir-birini almashtirish mumkin emas.

SinifVazifaChiqish namunasi
DateIntervalFormatterSana diapazoni21–25 iyul 2024
DateFormatterYakka sana21 iyul 2024
RelativeDateTimeFormatterNisbiy vaqt3 kun avval
DateComponentsFormatterMuddat2 soat 30 daqiqa
ISO8601DateFormatterISO 8601 format2024-07-21T14:30:00Z

DateIntervalFormatter qachon ishlatiladi: UI-da sana diapazonlarini ko‘rsatish uchun — mehmonxona bron qilish, tadbirlar, sanalar bo‘yicha filtrlash, operatsiyalar tarixi. Sanalar orasidagi muddatni hisoblash uchun DateComponentsFormatter ishlating, DateIntervalFormatter emas — ikkinchisi muddatni ko‘rsatish uchun mo‘ljallanmagan. DateFormatter faqat yakka sanalar uchun ishlatilishi kerak, ikki formatlangan sanani satr birlashtirish orqali yopishtirish uchun emas — bu ajratgichning lokalizatsiyasini yo‘qotishga olib keladi.

Chegara holati: DateIntervalFormatter ochiq diapazonlarni (tugash sanasisiz) ko‘rsatishni qo‘llab-quvvatlamaydi. Diapazonning oxiri noma’lum bo‘lsa (masalan, “21 iyuldan”), o‘zbek tili uchun “dan” old ko‘makchisi bilan DateFormatter ishlating. DateIntervalFormatter shuningdek turli kunlar uchun vaqt ko‘rsatilgan diapazonlarni qo‘llab-quvvatlamaydi — vaqt har bir sanaga alohida qo‘llaniladi, bu qisqa diapazonlar uchun ortiqcha ko‘rinishi mumkin.

Tez-tez beriladigan savollar

DateIntervalFormatter nima?

DateIntervalFormatter — sana diapazonlarini lokalizatsiyalangan satrlarga formatlash uchun Foundation sinfi. iOS 8 dan mavjud, avtomatik ravishda takrorlanuvchi komponentlarni (oy, yil) guruhlaydi va til uchun to‘g‘ri ajratgichni tanlaydi.

DateIntervalFormatter sanalarni qanday guruhlaydi?

Komponentlarni solishtiradi yildan kungacha. Agar yil mos kelsa — bir marta ko‘rsatiladi. Agar oy mos kelsa — bir marta ko‘rsatiladi. Farqli kunlar diapazon sifatida ko‘rsatiladi. Bu “21 iyul 2024 – 25 iyul 2024” o‘rniga “21–25 iyul 2024” beradi.

Diapazon ajratgichini o‘zgartirish mumkinmi?

Yo‘q, ajratgich locale tomonidan aniqlanadi va API orqali sozlanishi mumkin emas. Maxsus ajratgich uchun (masalan, “gacha” o‘rniga “–”) har bir sanani alohida DateFormatter bilan formatlab, satrlarni qo‘lda yopishtiring.

DateIntervalFormatter DateFormatter-dan nimasi bilan farq qiladi?

DateIntervalFormatter sana diapazonini (ikki sana) komponentlarning guruhlanishi bilan yaxlit bir butun sifatida formatlaydi. DateFormatter bitta sanani formatlaydi. Diapazonlar uchun har doim DateIntervalFormatter ishlating — bu ajratgichning to‘g‘ri lokalizatsiyasini ta’minlaydi.

Turli yillarda diapazonni qanday formatlash kerak?

Avtomatik — DateIntervalFormatter yillarning farqli ekanligini aniqlaydi va ikkala uchun to‘liq sanalarni ko‘rsatadi: “25 dekabr 2024 – 5 yanvar 2025”. Qo‘shimcha sozlashlar talab qilinmaydi, faqat dateStyle ni o‘rnatish kifoya.

Xulosa

  • DateIntervalFormatter — sana diapazonlarini formatlash uchun ixtisoslashgan sinif (iOS 8+)
  • Avtomatik guruhlash — takrorlanuvchi komponentlar (yil, oy) butun diapazon uchun bir marta ko‘rsatiladi
  • Lokalizatsiyalangan ajratgichlar — “dan–gacha” (o‘zbek), chiziqcha (ingliz), “bis” (nemis) — avtomatik
  • Sana va vaqt uslublari — .none, .short, .medium, .long, .full kombinatsiyalari diapazonning har ikki uchi uchun
  • Muddat uchun mos emas — muddatni hisoblash uchun DateComponentsFormatter ishlating
  • Maxsus ajratgichlarni qo‘llab-quvvatlamaydi — nostandart holatlar uchun qo‘lda formatlash talab qilinadi
  • DateInterval bilan integratsiya — DateInterval strukturasi contains va intersection tekshirishlarini ta’minlaydi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing