Date: bu nədir, Foundation-da vaxt tipi və TimeInterval

Müəllif: IT Sectr Dərc olunub: 2026-07-12 Oxuma vaxtı: 7 dəq

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 — reference date-dən saniyələrin sayı kimi mütləq zaman anını saxlayan Foundation strukturudur.
  • TimeInterval — saniyələrlə iki zaman anı arasındakı intervalı təmsil etmək üçün Double tipi.
  • Date() — çağırış anında cari zaman anı ilə obyekt yaradan inisializator.
  • Tarixlərin müqayisəsi müqayisə operatorları və ya compare, earlierDate, laterDate metodları vasitəsilə aparılır.
  • DateFormatter — tarixi istifadəçiyə oxunaqlı formatda göstərmək üçün məcburi komponent.

Foundation-da Date nədir?

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 vs digər vaxt tipləri

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

Swift-də Date yaratmaq

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 CalendarDateComponents 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.distantPastDate.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.

swift
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 və tarixlərin müqayisəsi

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 RangeClosedRange diapazonlarında istifadəsinə imkan verir.

swift
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 və DateComponents

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.

swift
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 və tarixin göstərilməsi

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 — dateStyletimeStyle ə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.

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

Date istifadə nümunələri

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

Doğum tarixindən yaşın hesablanması

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.

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
}

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 APIXüsusiyyət
Yaşın hesablanmasıCalendar.dateComponentstimeZone-u nəzərə alın
Geriyə sayımDate.timeIntervalSinceTimer+Combine
Tarixlərin qruplaşdırılmasıCalendar.dateIntervalGünə qədər normallaşdırma
JSON serializasiyasıISO8601DateFormatterLocale təsir etmir

Tez-tez verilən suallar

Date tarix sətirindən nə ilə fərqlənir?

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.

Niyə Date saat qurşağı haqqında məlumat ehtiva etmir?

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.

Core Data-da vaxt saxlamaq üçün hansı tipdən istifadə etməli?

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.

Date və CFAbsoluteTime arasındakı fərq nədir?

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 yüksək dəqiqlikli ölçmələr üçün istifadə oluna bilərmi?

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ə

  • Date — 1 yanvar 2001-ci il reference date-dən TimeInterval kimi mütləq zaman anını saxlamaq üçün Foundation value tipi.
  • TimeInterval (Double) — iki tarix arasındakı saniyələrin sayı, Date ilə müqayisə və arifmetik əməliyyatları təmin edir.
  • CalendarDateComponents — Date-dən il, ay, gün və digər təqvim komponentlərini çıxarmağın yeganə yolu.
  • DateFormatterISO8601DateFormatter — tarixləri sətir formatında göstərmək və serializasiya etmək üçün məcburi alətlər.
  • Date.distantPastDate.distantFuture — alqoritmlərdə filtrləmə və çeşidləmə üçün sərhəd dəyərlər.
  • Date timezone ehtiva etmir — saat qurşağı göstərilmə üçün komponentlərin çıxarılması zamanı Calendar səviyyəsində əlavə olunur.
  • Core Data və Codable Date-i nativ şəkildə dəstəkləyir, bu da əlavə çevirmələr olmadan tarixlərin saxlanması və ötürülməsini sadələşdirir.

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.

Layihəni müzakirə et

Həm də oxuyun