DateComponents — bu kalendar sanasining komponentlarini alohida maydonlar sifatida saqlaydigan Foundation strukturasi: yil, oy, kun, soat, daqiqa, soniya va boshqalar. Mutlaq vaqt momentini ifodalovchi Date dan farqli o'laroq, DateComponents kalendar va vaqt mintaqasiga bog'liq bo'lgan inson o'qiy oladigan qiymatlarni o'z ichiga oladi. Apple Developer Documentation (2025) ma'lumotlariga ko'ra, DateComponents Date va Calendar o'rtasidagi oraliq bo'g'in sifatida ishlatiladi — u orqali kalendar sanalari ajratib olinadi va tuziladi, qo'lda arifmetikasiz hisob-kitoblar va sanalarni siljitish amalga oshiriladi.
Asosiy
DateComponents — vaqtning kalendar komponentlarini saqlash uchun mo'ljallangan Foundation qiymat turi. Har bir komponent ixtiyoriy Int maydoni sifatida ifodalanadi: year, month, day, hour, minute, second, nanosecond, weekday, weekOfMonth, weekOfYear, quarter, yearForWeekOfYear va boshqalar.
Date dan asosiy farq — kalendarga bog'liqlik. Date mutlaq vaqtni (reference date dan soniyalar sonini) saqlaydi, DateComponents esa faqat ma'lum bir Calendar kontekstida ma'noga ega bo'lgan inson o'qiy oladigan ifodadir. Xuddi shu Date turli kalendarlar va vaqt mintaqalarida turli DateComponents lar bilan ifodalanishi mumkin.
DateComponents mustaqil vaqt turi emas, balki ma'lumot konteyneridir. DateComponents ni sana sifatida talqin qilish uchun komponentlarning kalendar tizimi bilan qanday bog'liqligini tushunadigan Calendar talab qilinadi. Calendar.dateComponents(from: Date) komponentlarni ajratib olishni, Calendar.date(from: DateComponents) esa teskari yig'ishni amalga oshiradi.
DateComponents ning har bir maydoni ixtiyoriy (Int?), bu to'liq bo'lmagan sanalar bilan ishlash uchun muhimdir. Agar faqat yil va oyni ko'rsatsangiz, Calendar yetishmayotgan maydonlarni standart qiymatlar bilan to'ldiradi: kun = 1, soat = 0, daqiqa = 0. Bu davr boshlanish sanalarini yaratish uchun qulay — faqat kerakli komponentlarni belgilash kifoya.
DateComponents ni == operatori bilan solishtirganda faqat belgilangan (nil bo'lmagan) maydonlar solishtiriladi. Yili 2026, ammo oylari farqli bo'lgan ikkita DateComponents strukturasi farqli deb hisoblanadi. DateComponents uchun NSObjectProtocol dan isEqual qo'llanilmaydi — DateComponents NSObject dan meros olmaydi.
Asosiy maydonlar DateComponents ga year, month, day, hour, minute, second, nanosecond kiradi. Har bir maydon tegishli birlikda raqamli qiymatni saqlaydi: yil – 2026, oy – 1..12, kun – 1..31, soat – 0..23, daqiqa – 0..59, soniya – 0..59. Nanosoniyalar 0..999999999 qiymatlarini qabul qilishi mumkin.
Hafta maydonlari – weekday (1..7, bu yerda 1 = Grigorian kalendarida yakshanba), weekOfMonth, weekOfYear. Bu maydonlar Calendar ga bog'liq va uning kontekstidan tashqarida ma'noga ega emas. weekday kalendarning firstWeekday sozlamasiga bog'liq: O'zbek lokalida hafta dushanbadan boshlanadi (Grigorian tizimida weekday = 2), Amerika lokalida esa – yakshanbadan (weekday = 1).
Ixtisoslashtirilgan maydonlar – quarter (1..4), yearForWeekOfYear (hafta tegishli bo'lgan yil), isLeapMonth (ibroniy yoki xitoy kalendarlarida kabisa oylari uchun mantiqiy bayroq). calendar va timeZone maydonlari struktura yaratilgan tegishli obyektlarga havolalarni saqlaydi.
| Kategoriya | Maydonlar | Diapazon |
|---|---|---|
| Kalendar | year, month, day | 1..∞, 1..12, 1..31 |
| Vaqt | hour, minute, second, nanosecond | 0..23, 0..59, 0..59, 0..999999999 |
| Haftalik | weekday, weekOfMonth, weekOfYear | 1..7, 1..5, 1..53 |
| Maxsus | quarter, yearForWeekOfYear | 1..4, bog'liq |
Calendar.dateComponents orqali komponentlarni ajratib olishda unumdorlik uchun faqat kerakli maydonlarni so'rash muhimdir. Calendar barcha so'ralgan maydonlarni bir o'tishda ajratib oladi — bu har bir maydon uchun Calendar.component ni alohida chaqirishdan sezilarli darajada tezroq.
DateComponents ni inicializatsiyasi — eng oddiy usul: bo'sh struktura yaratasiz va kerakli maydonlarni to'ldirasiz. Barcha ko'rsatilmagan maydonlar avtomatik ravishda nil oladi. Qisman komponentlardan yaratilgan sana inicializatsiya bosqichida tekshirilmaydi — xato faqat Calendar orqali Date ga aylantirilganda yuzaga kelishi mumkin.
DateComponents(calendar:timeZone:era:year:month:day:hour:minute:second:nanosecond:weekday:…) inicializatori barcha maydonlarni bir chaqiruvda belgilash imkonini beradi. Bu inicializator tayyor qiymatlardan to'liq sana yaratish uchun qulay, ammo o'qilishi sababli 5-6 argumentdan ko'prog'i bilan kamdan-kam ishlatiladi.
Calendar.dateComponents(_:from:) — mavjud Date dan DateComponents olishning asosiy usuli. Ikkinchi argument ajratib olinadigan komponentlar to'plamidir. Calendar vaqt mintaqasini hisobga olgan holda kalendar hisob-kitoblarini amalga oshiradi va faqat so'ralgan maydonlar bilan strukturani qaytaradi, qolgan maydonlar nil bo'lib qoladi.
import Foundation
// Maydonlar inizializatori orqali yaratish
var components = DateComponents()
components.year = 2026
components.month = 7
components.day = 21
// Date dan ajratib olish
let now = Date()
let extracted = Calendar.current.dateComponents(
[.year, .month, .day],
from: now
)
print("Today: \(extracted.day!).\(extracted.month!).\(extracted.year!)")
// Kengaytirilgan inizializator orqali yaratish
let birthday = DateComponents(
calendar: Calendar.current,
year: 1990, month: 5, day: 15
)
DateComponents ni maydonlar orqali qo'lda yaratishda har doim Calendar ni Date ga aylantirishdan oldin tekshiring. Calendar date(from:) aylantirishda komponentlar mavjud bo'lmagan sanani hosil qilsa nil qaytarishi mumkin — masalan, 31 fevral yoki kabisa bo'lmagan yilda 30 fevral. Sanani tekshirish Calendar ning mas'uliyati, DateComponentsniki emas.
Calendar.date(from:) — DateComponents ni Date ga aylantirishning asosiy metodi. Calendar komponentlarni o'z kalendar va vaqt mintaqasiga muvofiq talqin qiladi. Agar ba'zi maydonlar belgilanmagan bo'lsa (nil), Calendar standart qiymatlardan foydalanadi: kun = 1, soat = 0, daqiqa = 0, soniya = 0.
Metod ixtiyoriy Date qaytaradi — nil komponentlar bir-biriga zid bo'lganda yoki yaroqsiz sana hosil qilganda yuzaga keladi. Nil ning odatiy sabablari: mavjud bo'lmagan sana (32 yanvar, 29 fevral 2023), zid maydonlar (bir to'plamda weekday=1, day=5), berilgan kalendar uchun imkonsiz yil (Grigorian kalendarida yil 0).
timeZone bilan DateComponents — agar DateComponents timeZone ni o'z ichiga olsa, Calendar uni aylantirishda ishlatadi. Agar timeZone ko'rsatilmagan bo'lsa, Calendar o'z joriy timeZone dan foydalanadi. Agar Calendar.timeZone kutilgan vaqt mintaqasiga mos kelmasa, natija bir necha soat farq qilishi mumkin — obyektlardan birida timeZone aniq belgilanganligiga ishonch hosil qiling.
let calendar = Calendar(identifier: .gregorian)
// Date ni DateComponents dan yaratish
var comps = DateComponents()
comps.year = 2026
comps.month = 12
comps.day = 25
comps.hour = 10
if let date = calendar.date(from: comps) {
print("Christmas: \(date)")
}
// timeZone ko'rsatilgan holda yaratish
calendar.timeZone = TimeZone(identifier: "UTC")!
let utcComps = DateComponents(
calendar: calendar, year: 2026, month: 7, day: 21,
hour: 12
)
let utcDate = calendar.date(from: utcComps)!
Calendar.dateComponents sanalar farqi uchun — DateComponents dan foydalanishning yana bir stsenariysi. Calendar.dateComponents([.year, .month, .day], from: Date(), to: futureDate) ikki sana orasidagi farqni yillar, oylar va kunlarda qaytaradi. Bu TimeInterval ni yildagi soniyalar soniga bo'lish o'rniga yoshni hisoblashning to'g'ri usuli, chunki Calendar kabisa yillarini hisobga oladi.
Calendar — DateComponents bilan ishlaydigan markaziy sinf. Sanalarni ajratib olish, yig'ish va solishtirish bo'yicha barcha operatsiyalar Calendar orqali o'tadi. Calendar bo'lmasa, DateComponents vaqt ma'nosiga ega bo'lmagan oddiy raqamlar to'plamidir. Calendar komponentlarga talqin beradi: oy 2 fevral ekanligini, weekday 2 esa dushanba ekanligini aniqlaydi.
Calendar.nextDate va Calendar.enumerateDates — DateComponents ga asoslangan ikki metod. nextDate(after: Date(), matching: DateComponents) berilgan komponentlarga mos keladigan keyingi sanani topadi — masalan, bugundan keyingi dushanba. enumerateDates(startingAfter:matching:matchingPolicy:using:) ko'rsatilgan chegaragacha namunaga mos keladigan barcha sanalarni sanab o'tadi.
Calendar.dateInterval — ko'rsatilgan komponent uchun DateInterval qaytaruvchi metod. dateInterval(of: .month, for: Date()) joriy oyning boshi va oxirini qaytaradi. Ichki jihatdan bu metod davr chegaralarini topish uchun DateComponents dan foydalanadi: oyning birinchi va oxirgi kuni bilan DateComponents yaratadi, ularni Calendar orqali Date ga aylantiradi.
let calendar = Calendar.current
// Keyingi dushanba
let nextMonday = calendar.nextDate(
after: Date(),
matching: DateComponents(weekday: 2),
matchingPolicy: .nextTime
)!
// Sanalar orasidagi farq kunlarda
let diff = calendar.dateComponents(
[.day], from: Date(), to: nextMonday
)
// Oy diapazoni
let monthInterval = calendar.dateInterval(
of: .month, for: Date()
)!
let startOfMonth = monthInterval.start
let endOfMonth = monthInterval.end
MatchingPolicy — DateComponents bilan ishlashda Calendar metodlarining muhim parametri. strictPolicy barcha komponentlarning aniq mos kelishini talab qiladi, nextTimePolicy vaqt bo'yicha keyingi moslikni tanlaydi, nextTimePreservingSmallerComponents asl sanadan kichik komponentlarni (daqiqalar, soniyalar) saqlaydi. Siyosat tanlovi sanalarni qidirish natijasiga ta'sir qiladi, ayniqsa yozgi/qishki vaqtga o'tishda.
DateComponents dan ilovada amaliy foydalanish stsenariylarini ko'rib chiqamiz. Har bir misol iOS dasturchisi kalendar sanalari bilan ishlashda duch keladigan odatiy vazifani namoyish etadi.
Calendar.nextDate DateComponents(day: 1) bilan keyingi oyning birinchi kunini topadi. Calendar joriy oyda kunlar sonini avtomatik aniqlaydi va keyingi oyga o'tadi. Takrorlanuvchi bildirishnomalar uchun enumerateDates yoki Calendar kaliti bilan Combine.Timer dan foydalaning.
func firstDayOfNextMonth(from date: Date) -> Date {
let calendar = Calendar.current
let comps = DateComponents(day: 1)
return calendar.nextDate(
after: date,
matching: comps,
matchingPolicy: .nextTime
)!
}
// Yoshni yillar bilan hisoblash
func ageInYears(from birthDate: Date) -> Int {
let calendar = Calendar.current
let ageComponents = calendar.dateComponents(
[.year], from: birthDate, to: Date()
)
return ageComponents.year ?? 0
}
// Voqealarni yil va oy bo'yicha guruhlash
func groupEventsByMonth(_ events: [Event]) -> [String: [Event]] {
let calendar = Calendar.current
return Dictionary(grouping: events) { event in
let comps = calendar.dateComponents(
[.year, .month], from: event.date
)
return "\(comps.year!)-\(comps.month!)"
}
}
Yoshni hisoblash Calendar.dateComponents([.year], from:to:) orqali — kabisa yillarini hisobga oladigan yagona to'g'ri usul. TimeInterval ga asoslangan hisoblash (soniyalar / 31536000) 29 fevralda tug'ilganlar uchun xato beradi. Calendar joriy yilda tug'ilgan kun bo'lganligini to'g'ri aniqlaydi va aniq yoshni qaytaradi.
Yil va oy bo'yicha guruhlash — tarix yoki kalendar ekranlari uchun keng tarqalgan vazifa. DateComponents guruhlash kaliti sifatida xizmat qiladi: voqea sanasidan yil va oyni ajratib olasiz, satr kalitini shakllantirasiz va Dictionary(grouping:) orqali guruhlaysiz. Ko'rsatish uchun oyning lokal nomi uchun „LLLL yyyy” shabloni bilan DateFormatter dan foydalaning.
| Vazifa | Calendar metodi | DateComponents roli |
|---|---|---|
| Oyning birinchi kuni | nextDate(after:matching:) | day: 1 |
| Yoshni hisoblash | dateComponents(from:to:) | farqdan [.year] |
| Sanalarni guruhlash | dateComponents(_:from:) | year + month kaliti |
| Hafta kunini qidirish | nextDate(after:matching:) | weekday: N |
Tez-tez so'raladigan savollar
Sabablar: mavjud bo'lmagan sana (31 aprel), zid maydonlar (day=5 bilan weekday=1), tanlangan kalendar uchun yaroqsiz maydon kombinatsiyasi. Calendar komponentlarni o'z tizimida talqin qilishga harakat qiladi — agar kombinatsiya imkonsiz bo'lsa, natija nil. Aylantirishda har doim guard let yoki if let dan foydalaning.
Ha, == operatori orqali. DateComponents Equatable protokolini amalga oshiradi, barcha maydonlarni solishtiradi. Barcha maydonlari teng bo'lganda ikkita struktura teng hisoblanadi (nil == nil to'g'ri deb hisoblanadi). Faqat maydonlarning bir qismini solishtirish uchun – Calendar.dateComponents orqali bir xil to'plamni ajratib oling.
Date – kalendarga bog'liq bo'lmagan mutlaq vaqt momenti. DateComponents – faqat Calendar kontekstida ma'noga ega bo'lgan inson o'qiy oladigan raqamlar to'plami (yil, oy, kun). Date ni solishtirish, ayirish, ISO 8601 ga serializatsiya qilish mumkin. DateComponents – kalendar bilan o'zaro aloqa uchun oraliq ifoda.
Faqat year va month maydonlarini belgilang, qolganlarini nil qoldiring. Calendar.date(from:) orqali Date ga aylantirishda Calendar avtomatik ravishda kun = 1, soat = 0, daqiqa = 0 belgilaydi. Natija – yarim tunda ko'rsatilgan oyning birinchi kuniga mos keladigan Date.
DateComponents maydonlarda vaqt mintaqasi haqida ma'lumot saqlamaydi – maydonlarning qiymatlari (yil, oy, kun) o'zlari ajratib olingan timeZone ga bog'liq. „21 iyul 2026 14:00 MSK” va „21 iyul 2026 10:00 UTC” komponentlari bir xil Date ni ifodalaydi, ammo DateComponents maydonlari farqlidir.
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.