Date: шта је то, тип времена и TimeInterval у Foundation

Аутор: IT Sectr Објављено: 2026-07-12 Време читања: 7 мин

Date — је структура Foundation-а која представља конкретан тренутак времена независно од календара и временске зоне. Тип чува број секунди протеклих од референтног датума 1. јануара 2001. године (reference date) и обезбеђује основне операције поређења и израчунавања временских интервала. Према Apple Developer Documentation (2025), Date се користи у свим Apple оквирима: од UIKit и SwiftUI до CloudKit и Core Data. Разумевање рада Date-а је обавезно за сваког iOS програмера, јер без њега није могуће управљати временом у апликацији.

Главно

  • Date — структура Foundation-а која чува апсолутни тренутак времена као број секунди од reference date-а.
  • TimeInterval — тип Double за представљање интервала између два тренутка времена у секундама.
  • Date() — иницијализатор који креира објекат са тренутним временом у тренутку позива.
  • Поређење датума се врши путем оператора поређења или метода compare, earlierDate, laterDate.
  • DateFormatter — обавезна компонента за приказ датума кориснику у читљивом формату.

Шта је Date у Foundation-у?

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 може одговарати различитим календарским датумима у различитим временским зонама. За добијање компоненти (година, месец, дан) Date се претвара кроз Calendar и DateComponents.

Date се такође разликује од DispatchTime-а, који се користи за диспечинг задатака у Grand Central Dispatch-у. DispatchTime је релативан у односу на тренутак покретања система, док је Date апсолутна ознака која се може чувати, преносити и обнављати.

Креирање Date-а у Swift-у

Date() — је најједноставнији начин да се креира објекат са тренутним временом. Иницијализатор без аргумената враћа тачно време позива. За креирање датума у прошлости или будућности користе се TimeInterval и метод addingTimeInterval или иницијализација из постојећег Date-а.

За креирање произвољног датума из компоненти користи се пар Calendar и DateComponents. Calendar претвара људима читљиве компоненте (година, месец, дан, сат, минут) у Date. Такође се може иницијализовати Date кроз ISO8601DateFormatter из ниске у формату ISO 8601 или кроз DateFormatter из произвољног ниског приказа.

Date.distantPast и Date.distantFuture — две статичке особине које представљају бесконачно удаљене тренутке прошлости и будућности. Оне се користе као граничне вредности при филтрирању и сортирању датума у алгоритмима.

swift
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 и поређење датума

TimeInterval — је алиас за Double који представља број секунди између два тренутка времена. Прецизност TimeInterval-а достиже делове милисекунде, што је довољно за већину програмских задатака. Негативна вредност TimeInterval-а указује на прошлост у односу на референтну тачку.

Date подржава све стандардне операторе поређења: ==, <, >, <=, >=. Swift аутоматски упоређује унутрашње TimeInterval вредности. Метод compare враћа ComparisonResult са варијантама .orderedSame, .orderedAscending, .orderedDescending за експлицитније поређење.

Date.distance(to:) — метод који враћа TimeInterval до наведеног датума. Ако је циљни датум у прошлости, резултат је негативан. advanced(by:) креира нови датум додавањем наведеног TimeInterval-а тренутном датуму. Ови методи имплементирају протокол Strideable, омогућавајући коришћење Date-а у опсезима Range и ClosedRange.

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

Calendar — је мост између Date-а и људима читљивих компоненти. Calendar претвара Date у DateComponents (година, месец, дан, сат, минут, секунда) узимајући у обзир временску зону и локализацију. Без Calendar-а није могуће извући годину или месец из Date-а — Date не садржи ове информације због своје апсолутне природе.

Метод Calendar.component извлачи једну компоненту из Date-а: година, месец, дан, сат, минут, секунда, weekday, quarter. Метод Calendar.dateComponents извлачи скуп компоненти у једном позиву — ово је ефикасније него позивање component за свако поље појединачно.

Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — погодни методи за проверу релативних датума. Calendar.dateInterval враћа почетак и крај наведеног периода (дан, недеља, месец, година). Calendar.compare упоређује датуме са прецизношћу до наведене компоненте — на пример, годину без узимања у обзир месеца и дана.

swift
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 и приказ датума

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

swift
// Унапред подешени стилови
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-а

Размотримо типичне сценарије рада са Date-ом у iOS апликацији. Први сценарио — израчунавање година корисника из датума рођења. Други — тајмер одбројавања до догађаја. Трећи — груписање записа по датуму за приказ у виду секција табеле.

Израчунавање година из датума рођења

Calendar.dateComponents са заставицом [.year] израчунава разлику између два датума. Подешавање исправне временске зоне је критично — ако не наведете timeZone у Calendar-у, резултат може одступати за један дан због преласка поноћи у другој временској зони.

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
}

Тајмер одбројавања се реализује кроз TimeInterval. Израчунавамо разлику између циљног и тренутног датума, добијамо остатак у секундама и претварамо у дане, сате, минуте. За редовно ажурирање користи се Timer са интервалом од 1 секунде. ObservableObject са особином @Published омогућава SwiftUI-ју да аутоматски ажурира интерфејс.

Груписање по датуму се реализује кроз речник са кључем Date. Calendar.dateInterval(of: .day, for:) нормализује датум до почетка дана, што омогућава груписање записа који припадају истом дану. Исти приступ ради за недеље, месеце и године — довољно је променити компоненту у dateInterval на .weekOfYear или .month.

СценариоКључни APIКарактеристика
Израчунавање годинаCalendar.dateComponentsУзети у обзир timeZone
ОдбројавањеDate.timeIntervalSinceTimer+Combine
Груписање датумаCalendar.dateIntervalНормализација до дана
Серијализација JSONISO8601DateFormatterLocale не утиче

Често постављана питања

По чему се Date разликује од ниске датума?

Date — је унутрашњи приказ времена без везивања за календар и локализацију. Ниска је форматирани приказ зависан од подешавања корисника. Date се може поредити, серијализовати и математички обрађивати са стопостотном прецизношћу, док ниски приказ увек захтева парсирање кроз форматтер.

Зашто Date не садржи информацију о временској зони?

Date — је апсолутна временска ознака (број секунди од reference date-а) која не зависи од временске зоне. Временска зона је контекст приказа. Исти Date у UTC-у и у Београду представља исти физички тренутак, али се приказује као различито календарско време.

Који тип користити за чување времена у Core Data-и?

Date се директно подржава од стране Core Data-е као тип атрибута. Core Data аутоматски серијализује Date у складишту. За упите са филтрирањем по датуму користите NSPredicate са операторима поређења — Core Data исправно обрађује timezone на нивоу SQLite-а.

Која је разлика између Date-а и CFAbsoluteTime-а?

CFAbsoluteTime — је тип Core Foundation-а који користи исти референтни датум (1. јануар 2001). Date и CFAbsoluteTime су међусобно заменљиви кроз директну конверзију. Date(timeIntervalSinceReferenceDate:) прихвата CFAbsoluteTime, а Date.timeIntervalSinceReferenceDate враћа CFAbsoluteTime.

Може ли се Date користити за високопрецизна мерења?

Date има прецизност до милисекунде, али не гарантује наносекундну прецизност због хардверских ограничења iOS/macOS-а. За високопрецизна мерења користите mach_absolute_time или ContinuousClock из Swift 5.7+, који раде на хардверским бројачима циклуса процесора.

Закључак

  • Date — тип вредности Foundation-а за чување апсолутног тренутка времена као TimeInterval од reference date-а 1. јануара 2001. године.
  • TimeInterval (Double) — број секунди између два датума, обезбеђује поређење и аритметику са Date-ом.
  • Calendar и DateComponents — једини начин да се из Date-а извуку година, месец, дан и друге календарске компоненте.
  • DateFormatter и ISO8601DateFormatter — обавезни алати за приказ и серијализацију датума у текстуалном формату.
  • Date.distantPast и Date.distantFuture — граничне вредности за филтрирање и сортирање у алгоритмима.
  • Date не садржи timezone — временска зона се додаје на нивоу Calendar-а при извлачењу компоненти за приказ.
  • Core Data и Codable подржавају Date природно, што поједностављује чување и пренос датума без додатних конверзија.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође