DateComponents – bu nima, kalendar komponentlari va NSCalendar

Muallif: IT Sectr Nashr etilgan: 2026-07-12 O'qish vaqti: 7 daq

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 — sana komponentlarini (yil, oy, kun) ixtiyoriy butun son maydonlari sifatida saqlash uchun struktura.
  • Calendar.dateComponents — vaqt mintaqasini hisobga olgan holda Date dan ko'rsatilgan komponentlarni ajratib oluvchi metod.
  • Calendar.date(from:) — yetishmayotgan maydonlarni avtomatik to'ldirish bilan DateComponents ni Date ga teskari aylantirish.
  • Ixtiyoriy maydonlar — DateComponents ning har bir maydoni nil bo'lishi mumkin, bu to'liq bo'lmagan sanalarni belgilash imkonini beradi.
  • Range va komponentlar — DateComponents Calendar da sanalar orasidagi farqni hisoblash va diapazondagi sanalarni topish uchun ishlatiladi.

DateComponents nima?

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.

Maydonlarning ixtiyoriyligi

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.

Sana komponentlari: yil, oy, kun

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.

KategoriyaMaydonlarDiapazon
Kalendaryear, month, day1..∞, 1..12, 1..31
Vaqthour, minute, second, nanosecond0..23, 0..59, 0..59, 0..999999999
Haftalikweekday, weekOfMonth, weekOfYear1..7, 1..5, 1..53
Maxsusquarter, yearForWeekOfYear1..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 yaratish

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.

swift
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.

DateComponents ni Date ga aylantirish

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.

swift
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 va DateComponents

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.

swift
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 misollari

DateComponents dan ilovada amaliy foydalanish stsenariylarini ko'rib chiqamiz. Har bir misol iOS dasturchisi kalendar sanalari bilan ishlashda duch keladigan odatiy vazifani namoyish etadi.

Har oyning birinchi kuni uchun eslatma

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.

swift
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.

VazifaCalendar metodiDateComponents roli
Oyning birinchi kuninextDate(after:matching:)day: 1
Yoshni hisoblashdateComponents(from:to:)farqdan [.year]
Sanalarni guruhlashdateComponents(_:from:)year + month kaliti
Hafta kunini qidirishnextDate(after:matching:)weekday: N

Tez-tez so'raladigan savollar

Nima uchun Calendar.date(from:) DateComponents uchun nil qaytaradi?

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.

DateComponents larni bir-biri bilan solishtirish mumkinmi?

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.

DateComponents Date dan nimasi bilan farq qiladi?

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.

DateComponents da faqat yil va oyni qanday ko'rsatish mumkin?

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 vaqt mintaqalarini qanday qayta ishlaydi?

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

  • DateComponents – kalendar komponentlarini (yil, oy, kun, soat) ixtiyoriy Int? maydonlari sifatida saqlash uchun Foundation strukturasi.
  • Calendar.dateComponents vaqt mintaqasi va kalendar tizimini hisobga olgan holda Date dan komponentlarni ajratib oladi.
  • Calendar.date(from:) yetishmayotgan maydonlar uchun standart qiymatlardan foydalanib DateComponents dan Date yig'adi.
  • Maydonlarning ixtiyoriyligi to'liq bo'lmagan sanalarni belgilash imkonini beradi – Calendar yetishmayotgan qiymatlarni to'ldiradi.
  • Calendar.nextDate DateComponents ga mos keladigan keyingi sanani qidiradi – eslatmalar va takrorlanuvchi hodisalar uchun.
  • Yoshni hisoblash Calendar.dateComponents([.year], from:to:) orqali – kabisa yillarini hisobga oladigan yagona to'g'ri usul.
  • MatchingPolicy barcha komponentlar mos kelmaganda Calendar ning xatti-harakatini boshqaradi – sanalarni qidirish uchun muhim parametr.

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