Date: bu nima, Foundation-da vaqt turi va TimeInterval

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

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 — reference date-dan soniyalar soni sifatida mutlaq vaqt lahzasini saqlovchi Foundation strukturasi.
  • TimeInterval — soniyalarda ikki vaqt lahzasi orasidagi intervalni ifodalash uchun Double turi.
  • Date() — chaqiruv vaqtida joriy vaqt lahzasi bilan obyekt yaratuvchi initilizator.
  • Sanalarni taqqoslash taqqoslash operatorlari yoki compare, earlierDate, laterDate metodlari orqali amalga oshiriladi.
  • DateFormatter — sanani foydalanuvchiga o'qiladigan formatda ko'rsatish uchun majburiy komponent.

Foundation-da Date nima?

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 boshqa vaqt turlariga qarshi

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.

Swift-da Date yaratish

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.

swift
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 va sanalarni taqqoslash

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.

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

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.

swift
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 va sanani ko'rsatish

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.

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

Date dan foydalanish misollari

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.

Tug'ilgan sanadan yoshni hisoblash

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.

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

StsenariyAsosiy APIXususiyat
Yoshni hisoblashCalendar.dateComponentstimeZone ni hisobga oling
Ortga hisoblashDate.timeIntervalSinceTimer+Combine
Sanalarni guruhlashCalendar.dateIntervalKungacha normallashtirish
JSON serializatsiyasiISO8601DateFormatterLocale ta'sir qilmaydi

Tez-tez so'raladigan savollar

Date sana satridan nimasi bilan farq qiladi?

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.

Nega Date vaqt mintaqasi haqida ma'lumotni o'z ichiga olmaydi?

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.

Core Data da vaqtni saqlash uchun qaysi turdan foydalanish kerak?

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.

Date va CFAbsoluteTime o'rtasidagi farq nima?

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 yuqori aniqlikdagi o'lchovlar uchun ishlatilishi mumkinmi?

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

  • Date — 2001-yil 1-yanvar reference date dan TimeInterval sifatida mutlaq vaqt lahzasini saqlash uchun Foundation value turi.
  • TimeInterval (Double) — ikki sana orasidagi soniyalar soni, Date bilan taqqoslash va arifmetikani ta'minlaydi.
  • Calendar va DateComponents — Date dan yil, oy, kun va boshqa taqvim komponentlarini ajratib olishning yagona usuli.
  • DateFormatter va ISO8601DateFormatter — sanalarni satr formatida ko'rsatish va serializatsiya qilish uchun majburiy vositalar.
  • Date.distantPast va Date.distantFuture — algoritmlarda filtrlash va tartiblash uchun chegara qiymatlari.
  • Date timezone ni o'z ichiga olmaydi — vaqt mintaqasi ko'rsatish uchun komponentlarni ajratishda Calendar darajasida qo'shiladi.
  • Core Data va Codable Date ni nativ qo'llab-quvvatlaydi, bu qo'shimcha konvertatsiyalarsiz sanalarni saqlash va uzatishni soddalashtiradi.

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