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 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.
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.
| Diapazon | uz_UZ | en_US |
|---|---|---|
| Bir kun | 21 iyul 2024 | Jul 21, 2024 |
| Oy ichida | 21–25 iyul 2024 | Jul 21–25, 2024 |
| Turli oylar | 21 iyul – 5 avgust 2024 | Jul 21 – Aug 5, 2024 |
| Turli yillar | 25 dekabr 2024 – 5 yanvar 2025 | Dec 25, 2024 – Jan 5, 2025 |
| Vaqt bilan | 21 iyul 2024, 14:30–16:45 | Jul 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.
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.
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.
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))")
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.
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.
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).
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.
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.
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.
| Sinif | Vazifa | Chiqish namunasi |
|---|---|---|
| DateIntervalFormatter | Sana diapazoni | 21–25 iyul 2024 |
| DateFormatter | Yakka sana | 21 iyul 2024 |
| RelativeDateTimeFormatter | Nisbiy vaqt | 3 kun avval |
| DateComponentsFormatter | Muddat | 2 soat 30 daqiqa |
| ISO8601DateFormatter | ISO 8601 format | 2024-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 — 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.
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.
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 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.
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
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.