Date — је структура Foundation-а која представља конкретан тренутак времена независно од календара и временске зоне. Тип чува број секунди протеклих од референтног датума 1. јануара 2001. године (reference date) и обезбеђује основне операције поређења и израчунавања временских интервала. Према Apple Developer Documentation (2025), Date се користи у свим Apple оквирима: од UIKit и SwiftUI до CloudKit и Core Data. Разумевање рада Date-а је обавезно за сваког iOS програмера, јер без њега није могуће управљати временом у апликацији.
Главно
Date — је тип вредности из оквира Foundation који бележи један апсолутни тренутак времена. За разлику од календарских приказа (година, месец, дан), Date не зависи од временске зоне и календарског система — то је чисто нумеричка вредност временске ознаке.
Унутрашњи приказ Date-а је TimeInterval (алиас за Double) који чува број секунди у односу на референтни датум — 1. јануар 2001. 00:00:00 UTC. Apple је изабрао овај датум уместо Unix epoch (1970. година) ради компатибилности са старим NeXTSTEP системима на којима су засновани iOS и macOS.
Date се користи као стандардни тип времена у свим Apple API-јима: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Без Date-а није могуће радити са распоредима, тајмерима, календарским догађајима, серијализацијом података и било којим операцијама везаним за време.
Date се разликује од календарских типова по томе што представља физичку временску ознаку, а не вредност читљиву човеку. Исти Date може одговарати различитим календарским датумима у различитим временским зонама. За добијање компоненти (година, месец, дан) Date се претвара кроз Calendar и DateComponents.
Date се такође разликује од DispatchTime-а, који се користи за диспечинг задатака у Grand Central Dispatch-у. DispatchTime је релативан у односу на тренутак покретања система, док је Date апсолутна ознака која се може чувати, преносити и обнављати.
Date() — је најједноставнији начин да се креира објекат са тренутним временом. Иницијализатор без аргумената враћа тачно време позива. За креирање датума у прошлости или будућности користе се TimeInterval и метод addingTimeInterval или иницијализација из постојећег Date-а.
За креирање произвољног датума из компоненти користи се пар Calendar и DateComponents. Calendar претвара људима читљиве компоненте (година, месец, дан, сат, минут) у Date. Такође се може иницијализовати Date кроз ISO8601DateFormatter из ниске у формату ISO 8601 или кроз DateFormatter из произвољног ниског приказа.
Date.distantPast и Date.distantFuture — две статичке особине које представљају бесконачно удаљене тренутке прошлости и будућности. Оне се користе као граничне вредности при филтрирању и сортирању датума у алгоритмима.
import Foundation
// Креирање Date-а са тренутним временом
let now = Date()
print("Current time: \(now)")
// Датум за 1 сат (3600 секунди)
let inOneHour = now.addingTimeInterval(3600)
// Датум из компоненти
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!
У примеру су приказана три начина креирања Date-а: тренутно време, додавање интервала и креирање кроз DateComponents. Сва три приступа враћају вредност типа Date са прецизношћу до милисекунде. Calendar.current користи системски календар корисника — на Apple уређајима је то обично грегоријански календар.
TimeInterval — је алиас за Double који представља број секунди између два тренутка времена. Прецизност TimeInterval-а достиже делове милисекунде, што је довољно за већину програмских задатака. Негативна вредност TimeInterval-а указује на прошлост у односу на референтну тачку.
Date подржава све стандардне операторе поређења: ==, <, >, <=, >=. Swift аутоматски упоређује унутрашње TimeInterval вредности. Метод compare враћа ComparisonResult са варијантама .orderedSame, .orderedAscending, .orderedDescending за експлицитније поређење.
Date.distance(to:) — метод који враћа TimeInterval до наведеног датума. Ако је циљни датум у прошлости, резултат је негативан. advanced(by:) креира нови датум додавањем наведеног TimeInterval-а тренутном датуму. Ови методи имплементирају протокол Strideable, омогућавајући коришћење Date-а у опсезима Range и ClosedRange.
let start = Date()
let end = start.addingTimeInterval(86400)
// Поређење кроз операторе
if start < end {
print("start is earlier")
}
// 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")
}
TimeInterval једнак 86400 одговара једном дану. За сложеније интервале — недеље, месеце, године — користите Calendar и DateComponents, јер ове јединице имају променљиву дужину (преступне године, прелазак на летње време). TimeInterval се примењује само за фиксне размаке у секундама.
Calendar — је мост између Date-а и људима читљивих компоненти. Calendar претвара Date у DateComponents (година, месец, дан, сат, минут, секунда) узимајући у обзир временску зону и локализацију. Без Calendar-а није могуће извући годину или месец из Date-а — Date не садржи ове информације због своје апсолутне природе.
Метод Calendar.component извлачи једну компоненту из Date-а: година, месец, дан, сат, минут, секунда, weekday, quarter. Метод Calendar.dateComponents извлачи скуп компоненти у једном позиву — ово је ефикасније него позивање component за свако поље појединачно.
Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — погодни методи за проверу релативних датума. Calendar.dateInterval враћа почетак и крај наведеног периода (дан, недеља, месец, година). Calendar.compare упоређује датуме са прецизношћу до наведене компоненте — на пример, годину без узимања у обзир месеца и дана.
let calendar = Calendar.current
// Извлачење компоненти
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())
// Check relative date
if calendar.isDateInToday(someDate) {
print("Today!")
}
// Почетак и крај дана
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")
Calendar.current користи системска подешавања корисника — календар, временску зону и локализацију. За тестирање или специфична израчунавања може се креирати Calendar са конкретним параметрима кроз Calendar(identifier: .gregorian) и поставити жељени TimeZone кроз особину timeZone.
DateFormatter — обавезна компонента ако Date треба приказати кориснику. DateFormatter претвара Date у ниску према задатом формату и локализацији. Директно претварање Date-а у ниску кроз String(describing:) враћа технички приказ са reference date и TimeInterval-ом — није намењено кориснику.
Основни приступ је коришћење унапред подешених стилова dateStyle и timeStyle. iOS подржава четири стила: .short, .medium, .long, .full. Комбинација стилова датума и времена омогућава флексибилно подешавање приказа. DateFormatter аутоматски примењује локализацију: за српску локализацију датум ће се приказати у формату \"21. јул 2026.\".
ISO8601DateFormatter — специјализовани форматтер за ISO 8601, најраспрострањенији формат за API и размену података. Овај форматтер ради брже од DateFormatter-а и не зависи од локализације, што га чини пожељним за серијализацију датума у JSON-у.
// Унапред подешени стилови
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())
// ISO 8601 за API
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())
// Парсирање из ниске
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!
При раду са DateFormatter-ом важно је запамтити перформансе: креирање новог форматтера је скупа операција. Препоручује се кеширање форматтера или креирање једном и поновно коришћење. У особинама форматтера може се подесити timeZone — подразумевано се користи системска временска зона, али за серверске датуме често је потребан TimeZone(identifier: \"UTC\").
Размотримо типичне сценарије рада са Date-ом у iOS апликацији. Први сценарио — израчунавање година корисника из датума рођења. Други — тајмер одбројавања до догађаја. Трећи — груписање записа по датуму за приказ у виду секција табеле.
Calendar.dateComponents са заставицом [.year] израчунава разлику између два датума. Подешавање исправне временске зоне је критично — ако не наведете timeZone у Calendar-у, резултат може одступати за један дан због преласка поноћи у другој временској зони.
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
}
Тајмер одбројавања се реализује кроз TimeInterval. Израчунавамо разлику између циљног и тренутног датума, добијамо остатак у секундама и претварамо у дане, сате, минуте. За редовно ажурирање користи се Timer са интервалом од 1 секунде. ObservableObject са особином @Published омогућава SwiftUI-ју да аутоматски ажурира интерфејс.
Груписање по датуму се реализује кроз речник са кључем Date. Calendar.dateInterval(of: .day, for:) нормализује датум до почетка дана, што омогућава груписање записа који припадају истом дану. Исти приступ ради за недеље, месеце и године — довољно је променити компоненту у dateInterval на .weekOfYear или .month.
| Сценарио | Кључни API | Карактеристика |
|---|---|---|
| Израчунавање година | Calendar.dateComponents | Узети у обзир timeZone |
| Одбројавање | Date.timeIntervalSince | Timer+Combine |
| Груписање датума | Calendar.dateInterval | Нормализација до дана |
| Серијализација JSON | ISO8601DateFormatter | Locale не утиче |
Често постављана питања
Date — је унутрашњи приказ времена без везивања за календар и локализацију. Ниска је форматирани приказ зависан од подешавања корисника. Date се може поредити, серијализовати и математички обрађивати са стопостотном прецизношћу, док ниски приказ увек захтева парсирање кроз форматтер.
Date — је апсолутна временска ознака (број секунди од reference date-а) која не зависи од временске зоне. Временска зона је контекст приказа. Исти Date у UTC-у и у Београду представља исти физички тренутак, али се приказује као различито календарско време.
Date се директно подржава од стране Core Data-е као тип атрибута. Core Data аутоматски серијализује Date у складишту. За упите са филтрирањем по датуму користите NSPredicate са операторима поређења — Core Data исправно обрађује timezone на нивоу SQLite-а.
CFAbsoluteTime — је тип Core Foundation-а који користи исти референтни датум (1. јануар 2001). Date и CFAbsoluteTime су међусобно заменљиви кроз директну конверзију. Date(timeIntervalSinceReferenceDate:) прихвата CFAbsoluteTime, а Date.timeIntervalSinceReferenceDate враћа CFAbsoluteTime.
Date има прецизност до милисекунде, али не гарантује наносекундну прецизност због хардверских ограничења iOS/macOS-а. За високопрецизна мерења користите mach_absolute_time или ContinuousClock из Swift 5.7+, који раде на хардверским бројачима циклуса процесора.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође