Date: nedir, Foundation'da zaman türü ve TimeInterval

Yazar: IT Sectr Yayınlanma: 2026-07-12 Okuma süresi: 7 dk

Date, takvim ve saat diliminden bağımsız olarak belirli bir zaman anını temsil eden bir Foundation yapısıdır. Bu tür, 1 Ocak 2001 referans tarihinden itibaren geçen saniye sayısını saklar ve zaman aralıklarının karşılaştırılması ve hesaplanması için temel işlemler sağlar. Apple Developer Documentation'a (2025) göre Date, UIKit ve SwiftUI'den CloudKit ve Core Data'ya kadar tüm Apple çerçevelerinde kullanılır. Date'in nasıl çalıştığını anlamak her iOS geliştiricisi için gereklidir, çünkü onsuz bir uygulamada zamanı yönetmek imkansızdır.

Önemli Noktalar

  • Date — referans tarihinden itibaren saniye sayısı olarak mutlak bir zaman anını saklayan bir Foundation yapısı.
  • TimeInterval — saniye cinsinden iki zaman anı arasındaki aralığı temsil eden bir Double türü.
  • Date() — çağrı anında geçerli zaman anıyla bir nesne oluşturan bir başlatıcı.
  • Tarih karşılaştırma karşılaştırma operatörleri veya compare, earlierDate, laterDate yöntemleriyle yapılır.
  • DateFormatter — tarihleri kullanıcıya okunabilir bir biçimde görüntülemek için gerekli bir bileşen.

Foundation'da Date Nedir?

Date, Foundation çerçevesinden tek bir mutlak zaman anını yakalayan bir değer türüdür. Takvim temsillerinden (yıl, ay, gün) farklı olarak Date, saat dilimine veya takvim sistemine bağlı değildir — tamamen sayısal bir zaman damgası değeridir.

Date'in iç temsili TimeInterval'dır (Double için bir tür takma adı) ve referans tarihi olan 1 Ocak 2001, 00:00:00 UTC'ye göre saniye sayısını saklar. Apple, iOS ve macOS'un üzerine inşa edildiği eski NeXTSTEP sistemleriyle uyumluluk için Unix dönemi (1970) yerine bu tarihi seçmiştir.

Date, tüm Apple API'lerinde standart zaman türü olarak kullanılır: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Date olmadan programlar, zamanlayıcılar, takvim etkinlikleri, veri serileştirme ve zamanla ilgili herhangi bir işlemle çalışmak imkansızdır.

Date ve Diğer Zaman Türleri

Date, insan tarafından okunabilir bir değer yerine fiziksel bir zaman damgasını temsil etmesi bakımından takvim türlerinden farklıdır. Aynı Date, farklı saat dilimlerinde farklı takvim tarihlerine karşılık gelebilir. Bileşenleri (yıl, ay, gün) çıkarmak için Date, Calendar ve DateComponents aracılığıyla dönüştürülür.

Date ayrıca Grand Central Dispatch'te görev dağıtımı için kullanılan DispatchTime'dan da farklıdır. DispatchTime sistem başlatma zamanına göreceliyken, Date kaydedilebilen, iletilebilen ve geri yüklenebilen mutlak bir zaman damgasıdır.

Swift'te Date Oluşturma

Date() geçerli zaman anıyla bir nesne oluşturmanın en basit yoludur. Parametresiz başlatıcı, çağrının tam zamanını döndürür. Geçmişte veya gelecekte bir tarih oluşturmak için TimeInterval ve addingTimeInterval yöntemini veya mevcut bir Date'den başlatmayı kullanın.

Bileşenlerden rastgele bir tarih oluşturmak için Calendar ve DateComponents çiftini kullanın. Calendar, insan tarafından okunabilir bileşenleri (yıl, ay, gün, saat, dakika) Date'e dönüştürür. Ayrıca ISO8601DateFormatter aracılığıyla ISO 8601 dizesinden veya DateFormatter aracılığıyla rastgele bir dize temsilinden Date başlatabilirsiniz.

Date.distantPast ve Date.distantFuture, geçmişte ve gelecekte sonsuz uzak anları temsil eden iki statik özelliktir. Algoritmalarda tarihleri filtreleme ve sıralama için sınır değerler olarak kullanılırlar.

swift
import Foundation

// Geçerli saatle Date oluşturma
let now = Date()
print("Current time: \(now)")

// 1 saat (3600 saniye) sonra tarih
let inOneHour = now.addingTimeInterval(3600)

// Bileşenlerden tarih
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!

Örnek, Date oluşturmanın üç yolunu gösterir: geçerli saat, aralık ekleme ve DateComponents aracılığıyla oluşturma. Her üç yaklaşım da milisaniye hassasiyetinde Date türünde bir değer döndürür. Calendar.current, kullanıcının sistem takvimini kullanır — Apple cihazlarında bu genellikle Gregoryen takvimidir.

TimeInterval ve Tarih Karşılaştırma

TimeInterval, iki zaman anı arasındaki saniye sayısını temsil eden Double için bir tür takma adıdır. TimeInterval'in hassasiyeti milisaniyenin kesirlerine ulaşır ve çoğu pratik görev için yeterlidir. Negatif bir TimeInterval, referans noktasına göre geçmişi belirtir.

Date, tüm standart karşılaştırma operatörlerini destekler: ==, <, >, <=, >=. Swift, iç TimeInterval değerlerini otomatik olarak karşılaştırır. compare yöntemi, daha açık karşılaştırma için .orderedSame, .orderedAscending, .orderedDescending seçenekleriyle ComparisonResult döndürür.

Date.distance(to:), belirtilen tarihe kadar olan TimeInterval'i döndüren bir yöntemdir. Hedef tarih geçmişteyse sonuç negatiftir. advanced(by:), geçerli tarihe belirtilen TimeInterval'i ekleyerek yeni bir tarih oluşturur. Bu yöntemler Strideable protokolünü uygulayarak Date'in Range ve ClosedRange içinde kullanılmasına olanak tanır.

swift
let start = Date()
let end = start.addingTimeInterval(86400)

// Operatörlerle karşılaştırma
if start < end {
    print("start is earlier")
}

// Iki tarih arasında TimeInterval
let interval: TimeInterval = end.timeIntervalSince(start)
print("Seconds: \(Int(interval / 60)) minutes")

// Aralıkta Date kullanma
let range = start...end
let mid = start.addingTimeInterval(43200)
if range.contains(mid) {
    print("mid is between start and end")
}

86400 TimeInterval değeri bir güne karşılık gelir. Daha karmaşık aralıklar için — haftalar, aylar, yıllar — Calendar ve DateComponents kullanın, çünkü bu birimler değişken uzunluğa sahiptir (artık yıllar, yaz saati uygulaması). TimeInterval yalnızca saniye cinsinden sabit aralıklar için uygulanabilir.

Calendar ve DateComponents

Calendar, Date ile insan tarafından okunabilir bileşenler arasındaki köprüdür. Calendar, saat dilimini ve yerel ayarları dikkate alarak Date'i DateComponents'a (yıl, ay, gün, saat, dakika, saniye) dönüştürür. Calendar olmadan, Date'ten yıl veya ay çıkarmak imkansızdır — Date, mutlak doğası gereği bu bilgiyi içermez.

Calendar.component yöntemi, Date'ten tek bir bileşen çıkarır: yıl, ay, gün, saat, dakika, saniye, haftanın günü, çeyrek. Calendar.dateComponents yöntemi, tek bir çağrıda bir dizi bileşen çıkarır — bu, her alan için ayrı ayrı component çağırmaktan daha verimlidir.

Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday göreceli tarihleri kontrol etmek için kullanışlı yöntemlerdir. Calendar.dateInterval, belirtilen dönemin (gün, hafta, ay, yıl) başlangıcını ve bitişini döndürür. Calendar.compare, belirtilen bileşene kadar hassasiyetle tarihleri karşılaştırır — örneğin, ay ve günü dikkate almadan yıl.

swift
let calendar = Calendar.current

// Bileşenleri çıkarma
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())

// Göreceli tarihi kontrol et
if calendar.isDateInToday(someDate) {
    print("Today!")
}

// Günün başlangıcı ve bitişi
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")

Calendar.current, kullanıcının sistem ayarlarını kullanır — takvim, saat dilimi ve yerel ayarlar. Test veya belirli hesaplamalar için, Calendar(identifier: .gregorian) aracılığıyla belirli parametrelerle bir Calendar oluşturabilir ve timeZone özelliği aracılığıyla istenen TimeZone'u ayarlayabilirsiniz.

DateFormatter ve Tarih Görüntüleme

DateFormatter, Date'in kullanıcıya görüntülenmesi gerekiyorsa zorunlu bir bileşendir. DateFormatter, belirtilen biçime ve yerel ayarlara göre Date'i bir dizeye dönüştürür. String(describing:) aracılığıyla Date'i doğrudan dizeye dönüştürmek, referans tarihi ve TimeInterval ile teknik bir temsil döndürür — bu kullanıcılar için değildir.

Temel yaklaşım, önceden ayarlanmış stilleri dateStyle ve timeStyle kullanmaktır. iOS dört stili destekler: .short, .medium, .long, .full. Tarih ve saat stillerinin kombinasyonu, esnek görüntüleme yapılandırmasına olanak tanır. DateFormatter otomatik olarak yerelleştirme uygular: Rusça yerel ayarlar için tarih “21 Temmuz 2026” biçiminde görüntülenir.

ISO8601DateFormatter, API ve veri alışverişi için en yaygın biçim olan ISO 8601 için özel bir biçimlendiricidir. Bu biçimlendirici DateFormatter'dan daha hızlı çalışır ve yerel ayarlara bağlı değildir, bu da onu JSON'da tarihleri serileştirmek için tercih edilir kılar.

swift
// Önceden ayarlanmış stiller
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())

// API için ISO 8601
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())

// Dizeden ayrıştırma
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!

DateFormatter ile çalışırken performansı hatırlamak önemlidir: yeni bir biçimlendirici oluşturmak pahalı bir işlemdir. Biçimlendiriciyi önbelleğe almanız veya bir kez oluşturup yeniden kullanmanız önerilir. Biçimlendiricinin özellikleri timeZone ayarlamaya izin verir — varsayılan olarak sistem saat dilimi kullanılır, ancak sunucu tarihleri için genellikle TimeZone(identifier: “UTC”) gerekir.

Date Kullanım Örnekleri

Bir iOS uygulamasında Date ile çalışmanın tipik senaryolarını ele alalım. İlk senaryo, kullanıcının doğum tarihinden yaş hesaplamadır. İkincisi, bir etkinlik için geri sayım zamanlayıcısıdır. Üçüncüsü, tablo bölümleri olarak görüntülemek için kayıtları tarihe göre gruplamadır.

Doğum Tarihinden Yaş Hesaplama

Calendar.dateComponents [.year] bayrağıyla iki tarih arasındaki farkı hesaplar. Doğru saat dilimini ayarlamak kritiktir — Calendar'da timeZone belirtmezseniz, başka bir saat diliminde gece yarısını geçmesi nedeniyle sonuç bir gün farklılık gösterebilir.

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
}

Geri sayım zamanlayıcısı TimeInterval kullanılarak uygulanır. Hedef tarih ile geçerli tarih arasındaki farkı hesaplayın, saniye cinsinden kalanı alın ve gün, saat, dakikaya dönüştürün. Düzenli güncellemeler için 1 saniye aralıklı Timer kullanın. @Published özelliğine sahip bir ObservableObject, SwiftUI'nin arayüzü otomatik olarak güncellemesine olanak tanır.

Tarihe göre gruplama, Date'i anahtar olarak kullanan bir sözlük aracılığıyla uygulanır. Calendar.dateInterval(of: .day, for:) tarihi günün başlangıcına normalleştirir ve aynı güne ait kayıtları gruplamanıza olanak tanır. Aynı yaklaşım haftalar, aylar ve yıllar için de çalışır — dateInterval'deki bileşeni .weekOfYear veya .month olarak değiştirmeniz yeterlidir.

SenaryoAna APINotlar
Yaş hesaplamaCalendar.dateComponentstimeZone'u dikkate al
Geri sayımDate.timeIntervalSinceTimer+Combine
Tarih gruplamaCalendar.dateIntervalGüne normalleştir
JSON serileştirmeISO8601DateFormatterLocale etkilemez

Sıkça Sorulan Sorular

Date bir tarih dizesinden nasıl farklıdır?

Date, takvim ve yerel ayarlara bağlı olmayan bir iç zaman temsilidir. Dize, kullanıcı ayarlarına bağlı biçimlendirilmiş bir görüntülemedir. Date %100 doğrulukla karşılaştırılabilir, serileştirilebilir ve matematiksel olarak işlenebilirken, dize temsili her zaman bir biçimlendirici aracılığıyla ayrıştırma gerektirir.

Date neden saat dilimi bilgisi içermez?

Date, saat dilimine bağlı olmayan mutlak bir zaman damgasıdır (referans tarihinden itibaren saniye sayısı). Saat dilimi bir görüntüleme bağlamıdır. UTC'de ve Moskova'da aynı Date, aynı fiziksel anı temsil eder ancak farklı takvim zamanı olarak görüntülenir.

Core Data'da zaman saklamak için hangi tür kullanılmalıdır?

Date, Core Data tarafından bir öznitelik türü olarak yerel olarak desteklenir. Core Data, Date'i depolama alanına otomatik olarak serileştirir. Tarih filtreleme ile sorgular için karşılaştırma operatörleriyle NSPredicate kullanın — Core Data, SQLite düzeyinde saat dilimini doğru şekilde işler.

Date ve CFAbsoluteTime arasındaki fark nedir?

CFAbsoluteTime, aynı referans tarihini (1 Ocak 2001) kullanan bir Core Foundation türüdür. Date ve CFAbsoluteTime, doğrudan dönüştürme yoluyla birbirinin yerine kullanılabilir. Date(timeIntervalSinceReferenceDate:) CFAbsoluteTime'ı kabul eder ve Date.timeIntervalSinceReferenceDate CFAbsoluteTime döndürür.

Date yüksek hassasiyetli ölçümler için kullanılabilir mi?

Date milisaniye hassasiyetine sahiptir ancak iOS/macOS donanım sınırlamaları nedeniyle nanosaniye hassasiyetini garanti etmez. Yüksek hassasiyetli ölçümler için, donanım işlemci döngü sayaçlarında çalışan mach_absolute_time veya Swift 5.7+'dan ContinuousClock kullanın.

Özet

  • Date — 1 Ocak 2001 referans tarihinden itibaren TimeInterval olarak mutlak bir zaman anını saklamak için Foundation değer türü.
  • TimeInterval (Double) — iki tarih arasındaki saniye sayısı, Date ile karşılaştırma ve aritmetik sağlar.
  • Calendar ve DateComponents — Date'ten yıl, ay, gün ve diğer takvim bileşenlerini çıkarmanın tek yolu.
  • DateFormatter ve ISO8601DateFormatter — tarihleri dize biçiminde görüntülemek ve serileştirmek için gerekli araçlar.
  • Date.distantPast ve Date.distantFuture — algoritmalarda filtreleme ve sıralama için sınır değerler.
  • Date saat dilimi içermez — görüntüleme için bileşenler çıkarılırken Calendar düzeyinde saat dilimi eklenir.
  • Core Data ve Codable Date'i yerel olarak destekler, ek dönüştürmeler olmadan tarihlerin saklanmasını ve iletilmesini basitleştirir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun