1717200000 gibi bir sayıya bakıp hangi tarihi temsil ettiğini merak ettiysen, yalnız değilsin. Unix timestamp'i tarihe çevirmeyi öğrenmek, API'lar, veritabanları ve backend sistemlerle çalışan geliştiriciler için temel bir beceridir. Unix timestamp, basitçe 1 Ocak 1970 tarihinin 00:00:00 UTC'sinden (Unix epoch olarak bilinen referans noktası) bu yana geçen saniye (veya milisaniye) sayısıdır. Bu rehber, tarih-saat dönüştürme mekanizmalarını, zaman dilimi işlemeyi ve JavaScript, Python, SQL'deki pratik kod örneklerini ele alıyor, böylece tahmin etmeyi bırakıp güvenle dönüştürme yapabilirsin.
Önemli Noktalar:
- Unix timestamp, 1 Ocak 1970 UTC'den (epoch 0) itibaren geçen saniyeleri sayar ve tasarım gereği zaman diliminden bağımsızdır.
- Dönüştürme yapmadan önce timestamp'inin saniye mi milisaniye mi olduğunu mutlaka doğrula, çünkü bunları karıştırmak en yaygın hata kaynağıdır.
- Zaman dilimi kaymaları UTC'ye dönüştürme sonrasında açıkça uygulanmalı, öncesinde değil.
- JavaScript, Python ve SQL'in her birinde unix'ten tarihe dönüştürme için yerleşik fonksiyonlar var, ancak her birinin dikkat edilmesi gereken kendine özgü tuzakları bulunuyor.
İçindekiler
Unix Timestamp Nedir?
Unix timestamp, zamandaki tek ve net bir anı integer olarak temsil eder. Saat, 1 Ocak 1970, 00:00:00 UTC tarihinde, "epoch 0" olarak adlandırılan anda çalmaya başladı. O zamandan bu yana geçen her saniye sayacı bir artırıyor. Bu sadelik, bilgisayar sistemleri için evrensel zaman formatı haline gelmesinin tam sebebidir.
Sayının içinde ay, artık yıl, yaz saati uygulaması gibi düzenlemeler yoktur. Timestamp her zaman UTC tabanlıdır, bu da aynı sayının sunucu veya kullanıcının nerede olduğuna bakılmaksızın tamamen aynı anı ifade ettiği anlamına gelir. Bu hem en büyük avantajı hem de zaman formatı işleme konusunda geliştiricilerin kafasının karışmasının temel sebebidir.
Epoch zamanının modern bilgisayarcılığın temeli haline nasıl geldiğini derinlemesine incelemek için Epoch Time: Unix Timestamp'lerinin Temeli makalemize göz at.
Önemli bir ayrım: tüm Unix timestamp'leri saniye cinsinden saymaz. Bazı sistemler, özellikle JavaScript ortamları ve birçok REST API, milisaniye kullanır. 1717200000 timestamp'i saniye cinsindendir; 1717200000000 aynı anın milisaniye cinsinden karşılığıdır. Bunları karıştırmak tarih-saat dönüştürmedeki en sık görülen hatadır. Tek satır kod yazmadan önce kaynağının hangi birimi kullandığını doğrula.
Sisteminin hangi birimi kullanması gerektiğinden emin değil misin? Pratik bir analiz için Saniye vs Milisaniye vs Mikrosaniye: Hangi Unix Timestamp'i Kullanmalısın? makalesine bak.
Zaman Dilimi İşleme ve Yaygın Kayma Hataları
Unix zaman dilimi dönüştürme işlemi çoğu geliştiricinin tökezlediği noktadır. Timestamp'in kendisi her zaman UTC'dir. Zaman dilimi sadece bu timestamp'i bir kullanıcı veya log girişi için görüntülediğinde ya da yorumladığında önemlidir. Bu ayrımı anlamak bir hata kategorisinin tamamını önler.
UTC Temelleri
RFC 3339, UTC tarih-saatlerini metin olarak temsil etmenin standart formatını tanımlar (2024-06-01T00:00:00Z). Bir Unix timestamp'i insan tarafından okunabilir bir string'e dönüştürdüğünde, UTC tabanına bir zaman dilimi kayması uyguluyorsun. +05:30 (Hindistan Standart Saati) gibi pozitif bir kayma saat ve dakika ekler; -05:00 (ABD Doğu Standart Saati) gibi negatif bir kayma bunları çıkarır.
Otomatik Zaman Dilimi Algılama
Çoğu modern dil ve tarayıcı yerel zaman dilimini otomatik algılayabilir. JavaScript'te Intl.DateTimeFormat().resolvedOptions().timeZone, IANA zaman dilimi adını döndürür (örneğin America/New_York). Python'da zoneinfo modülü (Python 3.9+) IANA bölgelerini doğal olarak işler. Otomatik algılamaya güvenmek görüntüleme amaçları için iyidir, ancak timestamp'leri saklama veya hesaplama için asla buna güvenme.
Yaygın Kayma Hataları
- Yerel saati UTC olarak ele almak: Sunucun
UTC+2olarak ayarlandığı durumda zaman dilimi belirtmedendatetime.now()çağırırsan, UTC gibi görünen ama iki saat kayması olan yerel saat elde edersin. - Yaz Saati (DST) geçişleri:
+01:00gibi sabit bir kayma DST'yi hesaba katmaz. Mümkün olduğunca sabit kaymalar yerine adlandırılmış IANA bölgelerini (Europe/Berlin) kullan. - Milisaniye vs saniye uyumsuzluğu: Saniye bekleyen bir fonksiyona milisaniye timestamp'i geçirmek 55000+ yılında bir tarih üretir. Önce sayının büyüklüğünü kontrol et.
- Veritabanı zaman dilimi ayarları: MySQL ve PostgreSQL, oturum zaman dilimine bağlı olarak timestamp'leri farklı şekilde saklayabilir ve görüntüleyebilir. Timestamp'leri UTC olarak sakla ve uygulama katmanında dönüştür.
Kod Örnekleri: JavaScript, Python ve SQL
Aşağıdaki kod parçacıkları unix'ten tarihe dönüştürmenin en yaygın senaryolarını kapsar. Her örnek somut bir timestamp kullanır: 1717200000, bu da 1 Haziran 2024, 00:00:00 UTC'ye karşılık gelir.
JavaScript: Unix Timestamp Dönüştürme
JavaScript'in Date nesnesi milisaniye ile çalışır, bu yüzden saniye tabanlı timestamp'i önce 1000 ile çarp.
// JavaScript unix timestamp'i tarihe çevirme
const unixSeconds = 1717200000;
const date = new Date(unixSeconds * 1000); // milisaniyeye çevir
// UTC string
console.log(date.toUTCString());
// Çıktı: "Sat, 01 Jun 2024 00:00:00 GMT"
// Yerel zaman dilimi görünümü (tarayıcı/sistem zaman dilimini kullanır)
console.log(date.toLocaleString("tr-TR", { timeZone: "Europe/Istanbul" }));
// Çıktı: "01.06.2024 03:00:00"
// ISO 8601 formatı
console.log(date.toISOString());
// Çıktı: "2024-06-01T00:00:00.000Z"
Aynı timestamp'in İstanbul'da 1 Haziran 03:00 olarak görüntülendiğine dikkat et çünkü UTC gece yarısı İstanbul saatiyle 3 saat ileridedir. Bu bir hata değil; doğru unix zaman dilimi dönüştürme davranışıdır.
Python: Unix Timestamp'ten Datetime'a
Python'un datetime modülü temiz, açık metodlar sağlar. Üretim kodunda her zaman zaman dilimi farkında datetime nesneleri kullan.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo # Python 3.9+
unix_seconds = 1717200000
# Python unix timestamp'ten datetime'a (UTC)
dt_utc = datetime.fromtimestamp(unix_seconds, tz=timezone.utc)
print(dt_utc)
# Çıktı: 2024-06-01 00:00:00+00:00
# Belirli bir zaman dilimine çevirme
dt_istanbul = dt_utc.astimezone(ZoneInfo("Europe/Istanbul"))
print(dt_istanbul)
# Çıktı: 2024-06-01 03:00:00+03:00
# Okunabilir string olarak formatlama
print(dt_utc.strftime("%d %B %Y saat %H:%M UTC"))
# Çıktı: 01 June 2024 saat 00:00 UTC
tz argümanı olmadan datetime.fromtimestamp() kullanmak, yerel sistem saatinde naive (zaman dilimi farkında olmayan) datetime döndürür ve sunucu ortamlarında sessiz hatalara neden olabilir. Alışkanlık olarak her zaman tz=timezone.utc geçir.
SQL: Epoch'tan Datetime'a
Hem PostgreSQL hem MySQL doğrudan epoch'tan datetime dönüşümünü destekler.
-- PostgreSQL: unix timestamp'i tarihe çevirme
SELECT TO_TIMESTAMP(1717200000) AS converted_date;
-- Çıktı: 2024-06-01 00:00:00+00
-- MySQL: unix'ten tarihe dönüştürme
SELECT FROM_UNIXTIME(1717200000) AS converted_date;
-- Çıktı: 2024-06-01 00:00:00
-- Not: FROM_UNIXTIME oturum zaman dilimini kullanır. Açıkça ayarla:
SET time_zone = '+00:00';
SELECT FROM_UNIXTIME(1717200000);
Veritabanlarında timestamp saklama ve sorgulama konusunda daha derin rehberlik için Veritabanlarında Unix Timestamp'leri: Saklama ve Sorgular için En İyi Uygulamalar makalesine bak.
Yaygın Kullanım Durumları: Gerçek Sistemlerde epoch'tan datetime'a
Mekanizmaları anlamak bir şey. Epoch'tan datetime dönüşümünün gerçek sistemlerde nasıl çalıştığını görmek kalıcı öğrenmeyi sağlar. İşte yaygın SaaS geliştirme kalıplarından çıkarılmış üç somut senaryo.
Vaka Analizi: REST API Ayrıştırma, Veritabanı Saklama ve Backend Loglama
Üçüncü taraf REST API'dan olay verilerini toplayan bir SaaS analitik platformu düşün. Her API yanıtı "event_time": 1717200000 gibi bir alan içeriyor. Takımın bunu her katmanda nasıl işlediği şöyle:
1. REST API Ayrıştırma
Backend servisi JSON payload'ı alır ve hemen timestamp birimini doğrular. Değer 10 haneli olduğu için takım bunun saniye cinsinden olduğunu onaylar (13 hane milisaniyeyi gösterirdi). Python servisi herhangi bir işlem yapmadan önce bunu UTC farkında datetime nesnesine çevirir. Bu, alt fonksiyonların asla yanlışlıkla ham integer almamasını sağlar.
2. Veritabanı Saklama
Platform değeri PostgreSQL'de TIMESTAMPTZ (zaman dilimi ile timestamp) tipinde bir sütunda saklar. Uygulama her zaman TO_TIMESTAMP(1717200000) kullanarak UTC olarak ekler. UTC'de saklamak, şirket birden fazla bölgede kullanıcılara hizmet vermeye genişlediğinde veri taşıma ihtiyacının olmaması anlamına gelir. Sorgular her zaman UTC'de filtreler ve yerel saate sadece sunum katmanında çevirir.
3. Backend Loglama
Loglama pipeline'ı her log girişine ham Unix timestamp'in yanında ISO 8601 UTC string'i (2024-06-01T00:00:00Z) ekler. Bu ikili yaklaşım mühendislerin logları dönüştürme aracı olmadan doğrudan okuyabilmesi, otomatik izleme sistemlerinin ise integer değerler üzerinde kesin aritmetik yapabilmesi anlamına gelir. Bir hata raporu "hata Tokyo saatiyle sabah 9 civarında oldu" dediğinde, takım bunu Unix timestamp aralığına çevirir ve logları doğrudan sorgular.
Bu üç katmanlı kalıp (ayrıştır, UTC'de sakla, yerel olarak göster) herhangi bir üretim sisteminde tarih-saat dönüştürmeyi işlemenin en temiz yoludur.
Hızlı İpucu: Discord botları veya topluluk sunucularıyla çalışıyorsan, Unix timestamp'leri Discord'un yerel timestamp formatlama özelliğini de destekler. Discord Timestamp'leri Nasıl Çalışır ve Sunucunda Nasıl Kullanırsın rehberimizden öğren.
Sonuç
Unix timestamp'i okunabilir tarihe çevirmek, üç kuralı anladığında oldukça basittir: timestamp her zaman UTC'dir, birim saniye ya da milisaniyedir (çevirmeden önce doğrula), ve zaman dilimi kaymaları saklama zamanında değil görüntüleme zamanında uygulanır. JavaScript, Python veya SQL yazıyor olsan da, yerleşik araçlar açık zaman dilimi argümanlarıyla kullandığın sürece güvenilirdir. Yukarıdaki vaka analizinden üç katmanlı kalıbı uygula (ayrıştır, UTC'de sakla, yerel olarak göster) ve herhangi bir SaaS sisteminde tarih-saat dönüştürmedeki en yaygın tuzaklardan kaçınmış olursun.
Herhangi Bir Unix Timestamp'i Anında Çevir
Herhangi bir timestamp'i yapıştır ve tek tıkla tam UTC tarihini, yerel saatini ve zaman dilimi dökümünü al. Kurulum yok, kayıt gerektirmiyor.
unixtimestamp.app'te Ücretsiz Çeviriciyi Dene →
Saniye tabanlı timestamp 10 haneli bir sayıdır (2026 civarındaki tarihler için), milisaniye tabanlı timestamp ise 13 hanelidir. JavaScript'in Date nesnesi doğal olarak milisaniye kullanır. JavaScript'te saniye timestamp'i çevirmek için new Date()'e geçirmeden önce 1000 ile çarp. Bu iki birimi karıştırmak tamamen yanlış tarihlerin en yaygın sebebidir.
Bu beklenen davranıştır, hata değil. Unix timestamp bir UTC anını temsil eder. UTC gece yarısı senin zaman dilimin için önceki takvim gününe denk geliyorsa (örneğin UTC 00:00, Doğu saatiyle bir gün öncesinin 20:00'si), görüntülenen tarih farklı olacaktır. Görüntüleme için formatlarken hedef zaman dilimini her zaman açıkça belirt.
datetime modülünden datetime.fromtimestamp(ts, tz=timezone.utc) kullan. Bu zaman dilimi farkında UTC datetime nesnesi döndürür. tz argümanı olmadan datetime.fromtimestamp() çağırmaktan kaçın, çünkü yerel sistem zaman dilimini kullanır ve sunucu ortamlarında sessiz hatalara neden olabilecek naive datetime oluşturur.
Timestamp'leri TIMESTAMPTZ (PostgreSQL) olarak veya UTC integer'ları olarak sakla. "1 Haziran 2024" gibi formatlanmış string'leri saklamaktan kaçın çünkü bunları sorgulamak, sıralamak ve karşılaştırmak daha zordur. İnsan tarafından okunabilir formata sadece uygulama veya sunum katmanında çevir, veritabanını zaman diliminden bağımsız ve taşınabilir tut.
1 Ocak 1970 Unix epoch'u, erken Unix geliştiricileri tarafından uygun, yakın bir referans noktası olarak seçildi. Bu teknik bir gereklilik değil, 1970'lerin başında Unix'in Bell Labs'ta geliştirildiği dönemde alınan pratik bir karardı. O tarih o zamandan beri bilgisayar zaman ölçümü için evrensel standart haline geldi.