Unix Timestamp, 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısını temsil eden bir tam sayıdır. Bu evrensel zaman biçimi, saat dilimine bağımlı olmadan zaman işaretçilerini depolamak ve iletmek için işletim sistemlerinde, veritabanlarında, API'lerde ve mobil uygulamalarda kullanılır. Google Developers Blog (2025)'a göre, Unix Timestamp REST API'lerde zaman serileştirmesi için en popüler biçim olmaya devam ediyor — genel web arayüzlerinin %87'si bunu kullanıyor.
Anahtar Noktalar
Unix Timestamp (POSIX time, Epoch time veya Unix time olarak da bilinir), 1 Ocak 1970 00:00:00 UTC'den (Unix dönemi) bu yana geçen saniye sayısını tanımlayan bir zaman ölçüm sistemidir. Bu tarih, Unix işletim sistemi için başlangıç noktası olarak seçildi ve biçim daha sonra bilgi işlem sistemlerinde zamanı temsil etmek için fiili standart haline geldi. Timestamp artık saniyeleri hesaba katmaz — her dakika 60 saniye olarak sayılır, ancak Uluslararası Dünya Dönüş Servisi bazen atomik zamanı düzeltmek için fazladan bir saniye ekler.
1 Ocak 1970 seçimi, Unix işletim sisteminin tarihiyle bağlantılıdır. Geliştiriciler Ken Thompson ve Dennis Ritchie bu tarihi basit yuvarlak bir başlangıç noktası olarak seçtiler — tüm olası tarihleri kapsayacak kadar erken ve zamanın 32 bit işaretli bir tam sayıda saklanabilmesi için yeterince geçti. Başlangıçta zaman saniyenin altmışta biriyle, ardından tick'lerle (1/60 saniye) ölçüldü ve yalnızca Unix'in Yedinci Sürümünde (V7, 1979) biçim tam saniye sayısı olarak istikrar kazandı. The Open Group Base Specifications'a (Issue 8, 2024) göre, POSIX uyumlu sistemlerin bu biçimi desteklemesi zorunludur.
Unix Timestamp'in çalışma prensibi basit bir sayaca dayanır: geçen her gün değere 86.400 saniye ekler. Örneğin, 1.720.000.000 timestamp'i 2024 ortasındaki bir tarihe karşılık gelir — tam dönüştürme, bir gün, saat ve dakikadaki saniye sayısına bölünerek yapılabilir. Bu yaklaşım, timestamp'i makine depolaması için ideal hale getirir: 4 bayt (32 bit int) veya 8 bayt (64 bit long) kaplayan ve doğrudan karşılaştırmayı destekleyen bir tam sayıdır — daha büyük timestamp = daha sonraki bir tarih.
Bir gün = 86.400 saniye (24 x 60 x 60). Bir saat = 3.600 saniye. Bir timestamp'i tarihe dönüştürmek için, dönemden itibaren gün, saat, dakika ve saniye sayısını sırayla hesaplamanız gerekir. Ters dönüştürme — bir tarihi 1970-01-01'den itibaren günlere dönüştürün, ardından 86.400 ile çarpın ve UTC ofsetini ekleyin. Java ve Kotlin'de bu hesaplamalar zaten standart java.time.Instant ve java.util.Date sınıflarında uygulanmıştır ve geliştiriciyi manuel hesaplamalardan kurtarır.
// Unix Timestamp'i saniye cinsinden al
val seconds = System.currentTimeMillis() / 1000
// java.time ile timestamp'i tarihe dönüştür
val instant = Instant.ofEpochSecond(seconds)
val localDate = instant.atZone(ZoneId.of("Europe/Moscow")).toLocalDate()
// Ters: tarihten timestamp'e
val date = LocalDate.of(2026, 7, 21)
val ts = date.atStartOfDay(ZoneOffset.UTC).toEpochSecond()
Unix Timestamp'i insan tarafından okunabilir bir tarihe dönüştürmek, mobil geliştirmedeki en yaygın işlemlerden biridir. Android'de, minimum API sürümüne bağlı olarak çeşitli dönüştürme yöntemleri mevcuttur: API 26+ için java.time.Instant önerilir, eski sürümler için java.util.Date ve java.text.SimpleDateFormat kullanılır. Android ve JVM'in varsayılan olarak saniye değil milisaniye kullandığını hatırlamak önemlidir — sunucudan saniye cinsinden bir timestamp alınırsa, standart oluşturuculara aktarılmadan önce 1000 ile çarpılmalıdır.
Unix Timestamp'in başlıca avantajlarından biri konum bağımsızlığıdır. Sunucu her zaman timestamp'i UTC olarak döndürür ve yerel tarih ve saate dönüştürme istemci tarafında gerçekleştirilir. Kotlin'de, uygun ZoneId (sistem veya kullanıcı tarafından seçilen) ile ZonedDateTime kullanılır. Bir uygulama farklı saat dilimlerinde zaman gösteriyorsa (örneğin, gezginler için), timestamp sunucudan saat dilimini iletme ihtiyacını ortadan kaldırır — tek bir zaman işareti yeterlidir.
// Kullanıcı saat dilimi ile dönüştür
fun formatTimestamp(seconds: Long, zoneId: ZoneId): String {
val instant = Instant.ofEpochSecond(seconds)
val formatter = DateTimeFormatter
.ofPattern("dd.MM.yyyy HH:mm:ss")
return formatter.format(instant.atZone(zoneId))
}
// Örnek: timestamp = 1720000000, zone = Europe/Moscow
val result = formatTimestamp(1720000000, ZoneId.of("Europe/Moscow"))
2038 Yılı Sorunu (Y2K38), Unix Timestamp'in 32 bit işaretli bir tam sayı olarak depolanmasının temel bir sınırlamasıdır. 32 bit işaretli int'in maksimum değeri 2.147.483.647'dir ve bu, 19 Ocak 2038 03:14:07 UTC'ye karşılık gelir. Bu tarihten sonra değer taşar ve negatif bir sayıya dönüşerek 32 bit time_t kullanan sistemlerde arızalara neden olur. Sorun, iyi bilinen Y2K'ya benzer ancak öncelikle gömülü sistemleri, eski Android sürümlerini ve 32 bit mimarili IoT cihazlarını etkiler.
Linux Foundation'a (2025) göre, endüstriyel ve IoT segmentlerindeki Linux cihazlarının yaklaşık %15'i hala 32 bit yapıları kullanıyor. Android cihazlar için risk daha düşüktür — çoğu modern akıllı telefon 64 bit işlemcilerde (ARM64) çalışır, ancak Android 4.x ve altındaki eski modeller 32 bit time_t kullanabilir. Çözüm, 292 milyar yıla kadar güvenli olan 64 bit time_t'ye geçiştir. Android 5.0 (API 21) ile başlayarak, tüm cihazlar çekirdek düzeyinde 64 bit zaman kullanır. Mobil uygulama geliştiricilerinin, uygulama düzeyinde sorunu önlemek için timestamp'i Long (64 bit) olarak depolaması yeterlidir.
Android geliştirmede, Unix Timestamp'in doğru şekilde işlenmesi veri senkronizasyonu, mesaj alma sürelerinin görüntülenmesi, zaman aşımlarının hesaplanması ve bildirimlerin zamanlanması için kritiktir. Sistem çağrısı System.currentTimeMillis(), Unix döneminden bu yana milisaniye cinsinden geçerli zamanı döndürür — bu, cihazda bulunan en doğru zaman kaynağıdır. Ağ istekleri için genellikle saniye cinsinden Unix Timestamp kullanılır, çünkü çoğu REST API ve veritabanı saniye cinsinden çalışır.
Aralıkları ölçmek için asla System.currentTimeMillis() kullanmayın — bu amaç için System.nanoTime() vardır, monotondur ve kullanıcı saat değişikliklerinden etkilenmez. Zaman görüntüleme için, timestamp'i her zaman UTC olarak depolayın ve kullanıcı arayüzü tarafında yerel saat dilimine dönüştürün. Veritabanlarıyla (SQLite, Room) çalışırken INTEGER türünü kullanın ve timestamp'i saniye cinsinden depolayın — bu 8 bayt (Long) kaplar ve yerel SQL sıralamasını destekler. JSON serileştirmesi için, timestamp'i dize yerine sayı (Long) olarak göndermeniz önerilir — daha derli topludur ve daha hızlı ayrıştırılır.
// Doğru yürütme süresi ölçümü
val start = System.nanoTime()
// ... işlem ...
val elapsed = System.nanoTime() - start
val seconds = elapsed / 1_000_000_000.0
// Room'da (Entity) sakla
@Entity
data class Message(
@PrimaryKey val id: Long,
val text: String,
val createdAt: Long // Saniye cinsinden Unix Timestamp
)
Sunucudan Unix Timestamp alırken her zaman ölçüm birimini kontrol edin: bazı API'ler milisaniye (JavaScript uyumlu) döndürür, diğerleri saniye (POSIX standardı) döndürür. Birimler üzerindeki anlaşma API belgelerinde belirtilmelidir. Sunucu yanıtında, timestamp Long (JSON sayısı) veya String (ISO 8601) olarak iletilebilir. Hata ayıklama için, timestamp'i insan tarafından okunabilir bir biçimde çıkaran bir yardımcı işlev ekleyin — bu, geliştirme sırasında zaman işaretlerinin doğrulanmasını basitleştirir.
Bir veritabanında zaman depolama biçimi seçimi, sorgu performansını, kod karmaşıklığını ve saat dilimi işlemenin doğruluğunu doğrudan etkiler. Unix Timestamp, ilişkisel veritabanları için en verimli biçimdir: bir tam sayı (4 veya 8 bayt) olarak depolanır, indekslemeyi destekler ve hızlı sıralamaya olanak tanır. ISO 8601 dizelerinin aksine, timestamp sıralama için ayrıştırma gerektirmez ve bir dizinde daha az yer kaplar. Room ve SQLite için, timestamp'in INTEGER olarak depolanması ve zaman sütununda bir dizin kullanılması önerilir.
| Depolama Biçimi | Boyut | Sıralama | Dizinleme |
|---|---|---|---|
| Unix Timestamp (INTEGER) | 4–8 bayt | Hızlı | Verimli |
| ISO 8601 (TEXT) | 20–30 bayt | Yavaş | Orta |
| DATETIME (SQLite) | 8 bayt | Orta | Orta |
Room kitaplığını kullanan Android uygulamaları için, timestamp'lerin Long (64 bit) olarak depolanması ve Long ile Date veya Instant arasında otomatik dönüştürme için bir TypeConverter kullanılması önerilir. Veritabanında sorgulama yaparken karşılaştırma işleçlerini (>, <, BETWEEN) kullanın — bunlar tamsayı türleriyle yerel olarak çalışır. Zamana dayalı sıralama gerektiren verileri (örneğin, mesaj listesi) önbelleğe almak için, her zaman timestamp sütununda bir dizin oluşturun — bu, büyük veri hacimlerinde ORDER BY içeren sorguları birkaç kat hızlandıracaktır.
Sıkça Sorulan Sorular
Unix Timestamp, 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısıdır. Basit bir sayaç gibi çalışır: geçen her gün 86.400 saniye ekler. Saat dilimine bağımlı olmadan sunucu ve istemci arasında kolayca karşılaştırılabilen, sıralanabilen ve aktarılabilen bir tam sayıdır.
java.time (API 26+) için Instant.ofEpochSecond(timestamp) veya eski Android sürümleri için Date(timestamp * 1000) kullanın. Instant elde edildikten sonra LocalDate, ZonedDateTime'a dönüştürülebilir veya DateTimeFormatter ile biçimlendirilebilir. Timestamp saniye cinsindeyse 1000 ile çarpmayı unutmayın.
19 Ocak 2038 03:14:07 UTC'de, 32 bit işaretli int'in (2.147.483.647) değeri aşılacak ve taşmaya neden olacaktır. 32 bit time_t kullanan sistemler zamanı negatif bir sayı olarak yorumlamaya başlayacaktır. Çözüm, modern Android cihazlarda (API 21+) zaten kullanılan 64 bit time_t'ye geçiştir.
Saniye için System.currentTimeMillis() / 1000 veya milisaniye için System.currentTimeMillis() çağrısı yapın. Ağ senkronizasyonunu dikkate alan daha doğru bir sonuç için Instant.now().epochSecond (API 26+ gerekir) veya Android için NTP istemci kitaplıklarını kullanın.
Unix Timestamp, 1970-01-01 UTC'den itibaren saniyedir (tam sayı). Java Timestamp milisaniye kullanır — aynı ofset ancak 1000 kat daha hassas. Dönüştürme için: milisaniye 1000'e bölünür. JSON API'leri daha çok saniye (Unix Timestamp) kullanırken, Android platformu milisaniye (System.currentTimeMillis) kullanır.
Özet
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.
Ayrıca okuyun