Date — təqvim və saat qurşağından asılı olmayaraq konkret bir zaman anını təmsil edən Foundation strukturudur. Bu tip, istinad tarixi olan 1 yanvar 2001-ci il (reference date) tarixindən keçən saniyələrin sayını saxlayır və müqayisə və zaman intervallarının hesablanması üçün əsas əməliyyatları təmin edir. Apple Developer Documentation (2025) məlumatına görə, Date Apple-ın bütün freymvorklarında istifadə olunur: UIKit və SwiftUI-dən CloudKit və Core Data-ya qədər. Date-in işini başa düşmək hər bir iOS tərtibatçısı üçün məcburidir, çünki onsız tətbiqdə vaxtı idarə etmək mümkün deyil.
Əsas məqamlar
Date — Foundation freymvorkundan olan, bir mütləq zaman anını qeyd edən value tipidir. Təqvim təsvirlərindən (il, ay, gün) fərqli olaraq, Date saat qurşağından və təqvim sistemindən asılı deyil — bu sırf ədədi zaman damğası dəyəridir.
Date-in daxili təsviri TimeInterval-dir (Double üçün alias), istinad tarixinə — 1 yanvar 2001-ci il 00:00:00 UTC-yə nisbətən saniyələrin sayını saxlayır. Apple bu tarixi, Unix epoch (1970-ci il) əvəzinə, iOS və macOS-un əsasında duran köhnə NeXTSTEP sistemləri ilə uyğunluq üçün seçmişdir.
Date bütün Apple API-lərində standart vaxt tipi kimi istifadə olunur: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Date olmadan cədvəllər, taymerlar, təqvim hadisələri, məlumat serializasiyası və zamanla bağlı hər hansı əməliyyatlarla işləmək mümkün deyil.
Date təqvim tiplərindən onunla fərqlənir ki, fiziki zaman damğasını təmsil edir, insan tərəfindən oxuna bilən dəyəri deyil. Eyni Date müxtəlif saat qurşaqlarında fərqli təqvim tarixlərinə uyğun gələ bilər. Komponentləri (il, ay, gün) əldə etmək üçün Date Calendar və DateComponents vasitəsilə çevrilir.
Date həmçinin Grand Central Dispatch-də tapşırıqların dispetçerizasiyası üçün istifadə olunan DispatchTime-dan fərqlənir. DispatchTime sistemin işə salınma anına nisbətəndir, Date isə saxlanıla, ötürülə və bərpa oluna bilən mütləq damğadır.
Date() — cari zaman anı ilə obyekt yaratmağın ən sadə yoludur. Arqumentsiz inisializator çağırışın dəqiq vaxtını qaytarır. Keçmişdə və ya gələcəkdə tarix yaratmaq üçün TimeInterval və addingTimeInterval metodundan və ya mövcud Date-dən inisializasiyadan istifadə olunur.
Komponentlərdən ixtiyari tarix yaratmaq üçün Calendar və DateComponents cütlüyündən istifadə olunur. Calendar insan tərəfindən oxuna bilən komponentləri (il, ay, gün, saat, dəqiqə) Date-ə çevirir. Həmçinin ISO 8601 formatında sətirdən ISO8601DateFormatter vasitəsilə və ya ixtiyari sətir təsvirindən DateFormatter vasitəsilə Date inisializə etmək olar.
Date.distantPast və Date.distantFuture — keçmişin və gələcəyin sonsuz uzaq anlarını təmsil edən iki statik xüsusiyyətdir. Onlar alqoritmlərdə tarixləri filtrləmə və çeşidləmə zamanı sərhəd dəyərlər kimi istifadə olunur.
import Foundation
// Cari vaxt ilə Date yaratmaq
let now = Date()
print("Current time: \(now)")
// 1 saatdan sonra (3600 saniyə)
let inOneHour = now.addingTimeInterval(3600)
// Komponentlərdən tarix
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!
Nümunədə Date yaratmağın üç üsulu göstərilib: cari vaxt, intervalın əlavə edilməsi və DateComponents vasitəsilə yaratma. Hər üç yanaşma millisaniyə dəqiqliyi ilə Date tipində dəyər qaytarır. Calendar.current istifadəçinin sistem təqvimindən istifadə edir — Apple cihazlarında bu adətən Qriqorian təqvimidir.
TimeInterval — iki zaman anı arasındakı saniyələrin sayını təmsil edən Double üçün aliasdır. TimeInterval-in dəqiqliyi millisaniyənin fraksiyalarına çatır ki, bu da əksər tətbiqi tapşırıqlar üçün kifayətdir. Mənfi TimeInterval dəyəri istinad nöqtəsinə nisbətən keçmişi göstərir.
Date bütün standart müqayisə operatorlarını dəstəkləyir: ==, <, >, <=, >=. Swift dəyərlərin daxili TimeInterval-larını avtomatik müqayisə edir. compare metodu daha aşkar müqayisə üçün .orderedSame, .orderedAscending, .orderedDescending variantları ilə ComparisonResult qaytarır.
Date.distance(to:) — göstərilən tarixə qədər TimeInterval qaytaran metoddur. Hədəf tarix keçmişdədirsə, nəticə mənfi olur. advanced(by:) cari tarixə göstərilən TimeInterval-i əlavə edərək yeni tarix yaradır. Bu metodlar Strideable protokolunu tətbiq edərək Date-in Range və ClosedRange diapazonlarında istifadəsinə imkan verir.
let start = Date()
let end = start.addingTimeInterval(86400)
// Operatorlar vasitəsilə müqayisə
if start < end {
print("start is earlier")
}
// İki tarix arasında 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-ə bərabər TimeInterval bir sutkaya uyğundur. Daha mürəkkəb intervallar — həftələr, aylar, illər üçün Calendar və DateComponents istifadə edin, çünki bu vahidlər dəyişən uzunluğa malikdir (uzun illər, yay vaxtına keçid). TimeInterval yalnız saniyələrlə sabit fasilələr üçün tətbiq olunur.
Calendar — Date ilə insan tərəfindən oxuna bilən komponentlər arasında körpüdür. Calendar Date-i saat qurşağı və lokali nəzərə alaraq DateComponents-ə (il, ay, gün, saat, dəqiqə, saniyə) çevirir. Calendar olmadan Date-dən ili və ya ayı çıxarmaq mümkün deyil — Date mütləq təbiətinə görə bu məlumatı ehtiva etmir.
Calendar.component metodu Date-dən bir komponent çıxarır: il, ay, gün, saat, dəqiqə, saniyə, weekday, quarter. Calendar.dateComponents metodu bir çağırışda komponentlər dəstini çıxarır — bu, hər sahə üçün component-i ayrıca çağırmaqdan daha səmərəlidir.
Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — nisbi tarixləri yoxlamaq üçün rahat metodlar. Calendar.dateInterval göstərilən dövrün (gün, həftə, ay, il) başlanğıcını və sonunu qaytarır. Calendar.compare tarixləri göstərilən komponent dəqiqliyi ilə müqayisə edir — məsələn, ayı və günü nəzərə almadan ili.
let calendar = Calendar.current
// Komponentlərin çıxarılması
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())
// Check relative date
if calendar.isDateInToday(someDate) {
print("Today!")
}
// Günün başlanğıcı və sonu
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")
Calendar.current istifadəçinin sistem parametrlərindən — təqvim, saat qurşağı və lokaldan istifadə edir. Test etmək və ya spesifik hesablamalar üçün Calendar(identifier: .gregorian) vasitəsilə konkret parametrlərlə Calendar yaradıb timeZone xüsusiyyəti vasitəsilə lazımi TimeZone təyin etmək olar.
DateFormatter — Date-in istifadəçiyə göstərilməsi lazım olduqda məcburi komponentdir. DateFormatter Date-i verilmiş format və lokalizasiyaya uyğun sətirə çevirir. Date-i birbaşa String(describing:) vasitəsilə sətirə çevirmək reference date və TimeInterval ilə texniki təsvir qaytarır — bu istifadəçi üçün nəzərdə tutulmayıb.
Əsas yanaşma — dateStyle və timeStyle əvvəlcədən təyin edilmiş stillərindən istifadədir. iOS dörd stili dəstəkləyir: .short, .medium, .long, .full. Tarix və vaxt stillərinin kombinasiyası göstərilməni çevik şəkildə sazlamağa imkan verir. DateFormatter avtomatik lokalizasiya tətbiq edir: Azərbaycan lokalizasiyası üçün tarix \"21 iyul 2026\" formatında göstəriləcək.
ISO8601DateFormatter — ISO 8601 üçün ixtisaslaşmış formatterdir, API və məlumat mübadiləsi üçün ən geniş yayılmış formatdır. Bu formatter DateFormatter-dən daha sürətli işləyir və lokalizasiyadan asılı deyil, bu da onu JSON-da tarixlərin serializasiyası üçün üstünlük təşkil edir.
// Əvvəlcədən təyin edilmiş stillər
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())
// API üçün ISO 8601
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())
// Sətirdən pars etmə
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!
DateFormatter ilə işləyərkən məhsuldarlığı xatırlamaq vacibdir: yeni formatter yaratmaq bahalı əməliyyatdır. Formatter-i keşləmək və ya bir dəfə yaradıb təkrar istifadə etmək tövsiyə olunur. Formatter-in xüsusiyyətlərində timeZone təyin etmək olar — standart olaraq sistem saat qurşağı istifadə olunur, lakin server tarixləri üçün tez-tez TimeZone(identifier: \"UTC\") tələb olunur.
iOS tətbiqində Date ilə işin tipik ssenarilərinə baxaq. Birinci ssenari — istifadəçinin doğum tarixindən yaş hesablanması. İkinci — hadisəyə qədər geriyə sayım taymeri. Üçüncü — cədvəl bölmələri şəklində göstərmək üçün qeydlərin tarixə görə qruplaşdırılması.
Calendar.dateComponents [.year] bayrağı ilə iki tarix arasındakı fərqi hesablayır. Düzgün saat qurşağının təyin edilməsi kritikdir — əgər Calendar-da timeZone göstərilməzsə, nəticə başqa saat qurşağında gecə yarısının keçməsi səbəbindən bir gün fərqlənə bilər.
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
}
Geriyə sayım taymeri TimeInterval vasitəsilə reallaşdırılır. Hədəf tarixlə cari tarix arasındakı fərqi hesablayır, saniyələrdə qalığı alır və günlərə, saatlara, dəqiqələrə çeviririk. Müntəzəm yeniləmə üçün 1 saniyə intervalı ilə Timer istifadə olunur. @Published xüsusiyyətinə malik ObservableObject SwiftUI-ə interfeysi avtomatik yeniləməyə imkan verir.
Tarixə görə qruplaşdırma açarı Date olan lüğət vasitəsilə reallaşdırılır. Calendar.dateInterval(of: .day, for:) tarixi günün başlanğıcına normallaşdırır ki, bu da eyni günə aid qeydləri qruplaşdırmağa imkan verir. Eyni yanaşma həftələr, aylar və illər üçün də işləyir — dateInterval-də komponenti .weekOfYear və ya .month olaraq dəyişmək kifayətdir.
| Ssenari | Əsas API | Xüsusiyyət |
|---|---|---|
| Yaşın hesablanması | Calendar.dateComponents | timeZone-u nəzərə alın |
| Geriyə sayım | Date.timeIntervalSince | Timer+Combine |
| Tarixlərin qruplaşdırılması | Calendar.dateInterval | Günə qədər normallaşdırma |
| JSON serializasiyası | ISO8601DateFormatter | Locale təsir etmir |
Tez-tez verilən suallar
Date — təqvim və lokalizasiyaya bağlı olmayan daxili vaxt təsviridir. Sətir isə istifadəçinin parametrlərindən asılı olan formatlaşdırılmış görüntüdür. Date-i yüz faiz dəqiqliklə müqayisə etmək, serializasiya etmək və riyazi emal etmək olar, sətir təsviri isə həmişə formatter vasitəsilə pars etmə tələb edir.
Date — saat qurşağından asılı olmayan mütləq zaman damğasıdır (reference date-dən saniyələrin sayı). Saat qurşağı göstərilmə kontekstidir. Eyni Date UTC-də və Bakıda eyni fiziki anı təmsil edir, lakin fərqli təqvim vaxtı kimi göstərilir.
Date birbaşa Core Data tərəfindən atribut tipi kimi dəstəklənir. Core Data avtomatik olaraq Date-i yaddaşda serializasiya edir. Tarixə görə filtrləmə ilə sorğular üçün NSPredicate-dən müqayisə operatorları ilə istifadə edin — Core Data SQLite səviyyəsində timezone-u düzgün emal edir.
CFAbsoluteTime — eyni istinad tarixindən (1 yanvar 2001) istifadə edən Core Foundation tipidir. Date və CFAbsoluteTime birbaşa çevirmə vasitəsilə qarşılıqlı əvəz olunur. Date(timeIntervalSinceReferenceDate:) CFAbsoluteTime qəbul edir, Date.timeIntervalSinceReferenceDate isə CFAbsoluteTime qaytarır.
Date millisaniyəyə qədər dəqiqliyə malikdir, lakin iOS/macOS aparat məhdudiyyətləri səbəbindən nanosaniyə dəqiqliyinə zəmanət vermir. Yüksək dəqiqlikli ölçmələr üçün prosessor dövrü sayğaclarında işləyən mach_absolute_time və ya Swift 5.7+-dən ContinuousClock istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun