Date — taqvim va vaqt mintaqasidan qat'iy nazar muayyan vaqt lahzasini ifodalovchi Foundation strukturasi. Tur mos yozuvlar sanasi 2001-yil 1-yanvardan (reference date) o'tgan soniyalar sonini saqlaydi va taqqoslash hamda vaqt intervallarini hisoblash uchun asosiy operatsiyalarni ta'minlaydi. Apple Developer Documentation (2025) ma'lumotlariga ko'ra, Date Apple-ning barcha freymvorklarida qo'llaniladi: UIKit va SwiftUI dan CloudKit va Core Data gacha. Date ishlashini tushunish har bir iOS dasturchisi uchun majburiydir, chunki usiz ilovada vaqtni boshqarish mumkin emas.
Asosiy fikrlar
Date — Foundation freymvorkidan olingan, bitta mutlaq vaqt lahzasini qayd qiluvchi value turidir. Taqvim ko'rinishlaridan (yil, oy, kun) farqli o'laroq, Date vaqt mintaqasi va taqvim tizimiga bog'liq emas — bu sof raqamli vaqt belgisi qiymatidir.
Date ning ichki ko'rinishi TimeInterval (Double uchun alias) bo'lib, mos yozuvlar sanasiga — 2001-yil 1-yanvar 00:00:00 UTC ga nisbatan soniyalar sonini saqlaydi. Apple bu sanani Unix epoch (1970 yil) o'rniga, iOS va macOS asosida qurilgan eski NeXTSTEP tizimlari bilan moslik uchun tanlagan.
Date barcha Apple API larida standart vaqt turi sifatida ishlatiladi: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Date siz jadvallar, taymerlar, taqvim hodisalari, ma'lumotlar serializatsiyasi va vaqt bilan bog'liq har qanday operatsiyalar bilan ishlab bo'lmaydi.
Date taqvim turlaridan shu bilan farq qiladiki, u inson o'qiy oladigan qiymatni emas, balki jismoniy vaqt belgisini ifodalaydi. Xuddi shu Date turli vaqt mintaqalarida turli taqvim sanalariga mos kelishi mumkin. Komponentlarni (yil, oy, kun) olish uchun Date Calendar va DateComponents orqali o'zgartiriladi.
Date shuningdek, Grand Central Dispatch da vazifalarni dispetcherlash uchun ishlatiladigan DispatchTime dan farq qiladi. DispatchTime tizim ishga tushirilgan vaqtga nisbatan, Date esa saqlanishi, uzatilishi va tiklanishi mumkin bo'lgan mutlaq belgidir.
Date() — joriy vaqt lahzasi bilan obyekt yaratishning eng oddiy usuli. Argumentsiz initilizator chaqiruvning aniq vaqtini qaytaradi. O'tmish yoki kelajakda sana yaratish uchun TimeInterval va addingTimeInterval metodidan yoki mavjud Date dan initilizatsiyadan foydalaniladi.
Komponentlardan ixtiyoriy sana yaratish uchun Calendar va DateComponents juftligidan foydalaniladi. Calendar inson o'qiy oladigan komponentlarni (yil, oy, kun, soat, daqiqa) Date ga o'zgartiradi. Shuningdek, ISO 8601 formatidagi satrdan ISO8601DateFormatter orqali yoki ixtiyoriy satr ko'rinishidan DateFormatter orqali Date initilizatsiya qilish mumkin.
Date.distantPast va Date.distantFuture — o'tmish va kelajakning cheksiz uzoq lahzalarni ifodalovchi ikkita statik xususiyat. Ular algoritmlarda sanalarni filtrlash va tartiblashda chegara qiymatlari sifatida ishlatiladi.
import Foundation
// Joriy vaqt bilan Date yaratish
let now = Date()
print("Current time: \(now)")
// 1 soatdan keyin (3600 soniya)
let inOneHour = now.addingTimeInterval(3600)
// Komponentlardan sana
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!
Misolda Date yaratishning uchta usuli ko'rsatilgan: joriy vaqt, interval qo'shish va DateComponents orqali yaratish. Har uch yondashuv millisoniya aniqligi bilan Date turidagi qiymatni qaytaradi. Calendar.current foydalanuvchining tizim taqvimidan foydalanadi — Apple qurilmalarida bu odatda Grigorian taqvimidir.
TimeInterval — ikki vaqt lahzasi orasidagi soniyalar sonini ifodalovchi Double uchun aliasdir. TimeInterval aniqligi millisoniyaning ulushlariga yetadi, bu ko'pchilik amaliy vazifalar uchun yetarli. Manfiy TimeInterval qiymati mos yozuvlar nuqtasiga nisbatan o'tmishni ko'rsatadi.
Date barcha standart taqqoslash operatorlarini qo'llab-quvvatlaydi: ==, <, >, <=, >=. Swift qiymatlarning ichki TimeInterval larini avtomatik taqqoslaydi. compare metodi aniqroq taqqoslash uchun .orderedSame, .orderedAscending, .orderedDescending variantlari bilan ComparisonResult qaytaradi.
Date.distance(to:) — ko'rsatilgan sanagacha TimeInterval qaytaruvchi metod. Agar maqsadli sana o'tmishda bo'lsa, natija manfiy bo'ladi. advanced(by:) joriy sanaga ko'rsatilgan TimeInterval ni qo'shib yangi sana yaratadi. Bu metodlar Strideable protokolini implementatsiya qilib, Date ni Range va ClosedRange diapazonlarida ishlatishga imkon beradi.
let start = Date()
let end = start.addingTimeInterval(86400)
// Operatorlar orqali taqqoslash
if start < end {
print("start is earlier")
}
// Ikki sana orasidagi TimeInterval
let interval: TimeInterval = end.timeIntervalSince(start)
print("Seconds: \(Int(interval / 60)) minutes")
// Using Date in range
let range = start...end
let mid = start.addingTimeInterval(43200)
if range.contains(mid) {
print("mid is between start and end")
}
86400 ga teng TimeInterval bir sutkaga to'g'ri keladi. Murakkabroq intervallar — haftalar, oylar, yillar uchun Calendar va DateComponents dan foydalaning, chunki bu birliklar o'zgaruvchan uzunlikka ega (kabisa yillari, yozgi vaqtga o'tish). TimeInterval faqat soniyalardagi qattiq oraliqlar uchun qo'llaniladi.
Calendar — Date va inson o'qiy oladigan komponentlar orasidagi ko'prikdir. Calendar Date ni vaqt mintaqasi va lokalni hisobga olib DateComponents ga (yil, oy, kun, soat, daqiqa, soniya) o'zgartiradi. Calendar siz Date dan yil yoki oyni ajratib bo'lmaydi — Date mutlaq tabiati tufayli bu ma'lumotni o'z ichiga olmaydi.
Calendar.component metodi Date dan bitta komponentni ajratadi: yil, oy, kun, soat, daqiqa, soniya, weekday, quarter. Calendar.dateComponents metodi bir chaqiruvda komponentlar to'plamini ajratadi — bu har bir maydon uchun component ni alohida chaqirishdan ko'ra samaraliroq.
Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — nisbiy sanalarni tekshirish uchun qulay metodlar. Calendar.dateInterval ko'rsatilgan davrning (kun, hafta, oy, yil) boshi va oxirini qaytaradi. Calendar.compare sanalarni ko'rsatilgan komponent aniqligi bilan taqqoslaydi — masalan, oy va kunni hisobga olmasdan yilni.
let calendar = Calendar.current
// Komponentlarni ajratish
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())
// Check relative date
if calendar.isDateInToday(someDate) {
print("Today!")
}
// Kunning boshi va oxiri
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")
Calendar.current foydalanuvchining tizim sozlamalaridan — taqvim, vaqt mintaqasi va lokaldan foydalanadi. Sinov yoki maxsus hisob-kitoblar uchun Calendar(identifier: .gregorian) orqali aniq parametrlar bilan Calendar yaratib, timeZone xususiyati orqali kerakli TimeZone ni o'rnatish mumkin.
DateFormatter — agar Date foydalanuvchiga ko'rsatilishi kerak bo'lsa, majburiy komponent. DateFormatter Date ni berilgan format va lokalizatsiyaga muvofiq satrga o'zgartiradi. Date ni String(describing:) orqali to'g'ridan-to'g'ri satrga aylantirish reference date va TimeInterval bilan texnik ko'rinishni qaytaradi — bu foydalanuvchi uchun mo'ljallanmagan.
Asosiy yondashuv — dateStyle va timeStyle oldindan o'rnatilgan uslublardan foydalanish. iOS to'rtta uslubni qo'llab-quvvatlaydi: .short, .medium, .long, .full. Sana va vaqt uslublarining kombinatsiyasi ko'rinishni moslashuvchan sozlash imkonini beradi. DateFormatter avtomatik lokalizatsiyani qo'llaydi: o'zbek lokalizatsiyasi uchun sana \"2026-yil 21-iyul\" formatida ko'rsatiladi.
ISO8601DateFormatter — ISO 8601 uchun ixtisoslashgan formatter, API va ma'lumot almashish uchun eng keng tarqalgan format. Bu formatter DateFormatter dan tezroq ishlaydi va lokalizatsiyaga bog'liq emas, bu uni JSON da sanalarni serializatsiya qilish uchun afzal qiladi.
// Oldindan o'rnatilgan uslublar
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())
// API uchun ISO 8601
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())
// Satrdan pars qilish
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!
DateFormatter bilan ishlashda unumdorlikni esda tutish muhim: yangi formatter yaratish qimmat operatsiyadir. Formatterni keshga olish yoki bir marta yaratib qayta ishlatish tavsiya etiladi. Formatter xususiyatlarida timeZone ni o'rnatish mumkin — sukut bo'yicha tizim vaqt mintaqasi ishlatiladi, lekin server sanalari uchun ko'pincha TimeZone(identifier: \"UTC\") talab qilinadi.
iOS ilovasida Date bilan ishlashning odatiy stsenariylarini ko'rib chiqamiz. Birinchi stsenariy — foydalanuvchining tug'ilgan sanasidan yoshni hisoblash. Ikkinchisi — tadbirgacha ortga hisoblash taymeri. Uchinchisi — jadval bo'limlari ko'rinishida ko'rsatish uchun yozuvlarni sana bo'yicha guruhlash.
Calendar.dateComponents [.year] bayrog'i bilan ikki sana orasidagi farqni hisoblaydi. To'g'ri vaqt mintaqasini o'rnatish juda muhim — agar Calendar da timeZone ko'rsatilmasa, natija boshqa vaqt mintaqasida yarim tunning o'tishi tufayli bir kunga farq qilishi mumkin.
func calculateAge(from birthDate: Date) -> Int {
let calendar = Calendar.current
let now = Date()
let components = calendar.dateComponents(
[.year], from: birthDate, to: now
)
return components.year ?? 0
}
Ortga hisoblash taymeri TimeInterval orqali amalga oshiriladi. Maqsadli sana va joriy sana orasidagi farqni hisoblaymiz, soniyalarda qoldiqni olamiz va kunlar, soatlar, daqiqalarga o'zgartiramiz. Muntazam yangilash uchun 1 soniya interval bilan Timer ishlatiladi. @Published xususiyatiga ega ObservableObject SwiftUI ga interfeysni avtomatik yangilash imkonini beradi.
Sana bo'yicha guruhlash kaliti Date bo'lgan lug'at orqali amalga oshiriladi. Calendar.dateInterval(of: .day, for:) sanani kun boshiga normallashtiradi, bu esa bir kunga tegishli yozuvlarni guruhlash imkonini beradi. Xuddi shu yondashuv haftalar, oylar va yillar uchun ham ishlaydi — dateInterval dagi komponentni .weekOfYear yoki .month ga o'zgartirish kifoya.
| Stsenariy | Asosiy API | Xususiyat |
|---|---|---|
| Yoshni hisoblash | Calendar.dateComponents | timeZone ni hisobga oling |
| Ortga hisoblash | Date.timeIntervalSince | Timer+Combine |
| Sanalarni guruhlash | Calendar.dateInterval | Kungacha normallashtirish |
| JSON serializatsiyasi | ISO8601DateFormatter | Locale ta'sir qilmaydi |
Tez-tez so'raladigan savollar
Date — taqvim va lokalizatsiyaga bog'liq bo'lmagan ichki vaqt ko'rinishi. Satr esa foydalanuvchi sozlamalariga bog'liq formatlangan ko'rinishdir. Date ni yuz foiz aniqlik bilan taqqoslash, serializatsiya qilish va matematik qayta ishlash mumkin, satr ko'rinishi esa har doim formatter orqali pars qilishni talab qiladi.
Date — vaqt mintaqasiga bog'liq bo'lmagan mutlaq vaqt belgisi (reference date dan soniyalar soni). Vaqt mintaqasi ko'rsatish kontekstidir. Xuddi shu Date UTC da va Toshkentda bir xil jismoniy lahzani ifodalaydi, lekin turli taqvim vaqti sifatida ko'rsatiladi.
Date to'g'ridan-to'g'ri Core Data tomonidan atribut turi sifatida qo'llab-quvvatlanadi. Core Data avtomatik Date ni omborda serializatsiya qiladi. Sana bo'yicha filtrlash bilan so'rovlar uchun NSPredicate dan taqqoslash operatorlari bilan foydalaning — Core Data SQLite darajasida timezone ni to'g'ri qayta ishlaydi.
CFAbsoluteTime — xuddi shu mos yozuvlar sanasidan (2001-yil 1-yanvar) foydalanadigan Core Foundation turi. Date va CFAbsoluteTime to'g'ridan-to'g'ri konvertatsiya orqali o'zaro almashinadi. Date(timeIntervalSinceReferenceDate:) CFAbsoluteTime ni qabul qiladi, Date.timeIntervalSinceReferenceDate esa CFAbsoluteTime ni qaytaradi.
Date millisoniyagacha aniqlikka ega, ammo iOS/macOS apparat cheklovlari tufayli nanosecond aniqlikka kafolat bermaydi. Yuqori aniqlikdagi o'lchovlar uchun protsessor sikl hisoblagichlarida ishlaydigan mach_absolute_time yoki Swift 5.7+ dan ContinuousClock dan foydalaning.
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.
Shuningdek o'qing