Unix Timestamp Tam Rehberi: Saniye/Milisaniye/Mikrosaniye Dönüşümü ve Zaman Dilimi Pratikleri
Unix zaman damgaları zamanı “Unix epoch’tan (1 Ocak 1970, 00:00:00 UTC) bu yana geçen süre” olarak ifade eder. Dünyadaki web sunucularının %95’inden ve veri tabanı sistemlerinin %90’ından fazlası bu temsili dahili olarak kullanır. Bu rehber; hassasiyet farklarını, programlama dili uygulamalarını, zaman dilimi yönetimini ve yaz saati uygulamasıyla ilgili dikkat noktalarını ele alır.
Unix Timestamp’in Kökeni ve Tanımı
Unix epoch 1 Ocak 1970, 00:00:00 UTC’de başladı. Unix zaman damgası 0 tam olarak bu ana karşılık gelir; 1262304000 ise 2010-01-01 00:00:00 UTC’yi temsil eder. Sistem, varsayılan olarak artık saniye etkilerini görmezden gelir.
Bu değer başlangıçta 32 bitlik işaretli tam sayı olarak saklanıyordu ve bu durum 2038 Yılı Sorunu’nu doğurdu — maksimum değer 19 Ocak 2038, 03:14:07 UTC’de taşar. Modern sistemler 64 bitlik tam sayılar kullanarak temsil edilebilir zaman aralığını önemli ölçüde uzatır.
Zaman Hassasiyeti Farkları
| Birim | Saniyedeki Adet | Basamak | Tipik Kullanım Alanları |
|---|---|---|---|
| Saniye (s) | 1 | 10 | Geleneksel Unix/Linux sistemleri |
| Milisaniye (ms) | 1.000 | 13 | JavaScript, Java, log kayıtları |
| Mikrosaniye (μs) | 1.000.000 | 16 | Dağıtık izleme, veri tabanları |
| Nanosaniye (ns) | 1.000.000.000 | 19 | Go dili, performans analizi |
Pratik kural: 10 basamaklı zaman damgaları genellikle saniyeyi, 13 basamaklılar milisaniyeyi, 16 basamaklılar mikrosaniyeyi, 19 basamaklılar ise nanosaniyeyi temsil eder.
JavaScript Zaman Damgaları
JavaScript doğrudan milisaniye kullanır. Date() kurucusu girilen sayının milisaniye olduğunu varsayar — saniye düzeyindeki zaman damgaları için değeri 1000 ile çarpmanız gerekir.
// Geçerli Unix zaman damgasını al (milisaniye cinsinden)
const timestampMs = Date.now();
console.log(timestampMs); // Örnek çıktı: 1692268800123
// Saniye düzeyinde zaman damgası için milisaniyeyi 1000'e bölüp aşağı yuvarlayın
const timestampSec = Math.floor(Date.now() / 1000);
console.log(timestampSec); // Örnek çıktı: 1692268800
// Unix zaman damgasını tekrar Date nesnesine dönüştürme
let ts = 1692268800;
let date = new Date(ts * 1000);
console.log(date.toISOString()); // "2023-08-17T16:00:00.000Z"
Python Zaman Damgaları
Python’da time.time() saniye düzeyindeki Unix zaman damgasını kayan nokta değeri olarak döndürür:
import time
from datetime import datetime, timezone
# Geçerli Unix zaman damgasını al (saniye, float)
now_sec = time.time()
print(now_sec) # Örnek çıktı: 1692268800.123456
# Milisaniyeyi al (integer)
now_millis = int(time.time() * 1000)
print(now_millis) # Örnek: 1692268800123
# Nanosaniyeyi al (Python 3.7+)
now_nanos = time.time_ns()
print(now_nanos) # Örnek: 1692268800123456789
# datetime'a dönüştürme
ts = 1692268800
dt_local = datetime.fromtimestamp(ts)
dt_utc = datetime.fromtimestamp(ts, timezone.utc)
print(dt_local.strftime("%Y-%m-%d %H:%M:%S")) # Yerel saat
print(dt_utc.strftime("%Y-%m-%d %H:%M:%S")) # UTC saati
Go Dilinde Zaman Damgaları
Go’nun time kütüphanesi birden çok hassasiyet düzeyi sunar:
package main
import (
"fmt"
"time"
)
func main() {
// Geçerli Unix zaman damgasını al
sec := time.Now().Unix() // Saniye
msec := time.Now().UnixMilli() // Milisaniye (Go 1.17+)
nsec := time.Now().UnixNano() // Nanosaniye
fmt.Println(sec) // Örnek: 1692268800
fmt.Println(msec) // Örnek: 1692268800123
fmt.Println(nsec) // Örnek: 1692268800123456789
// Zaman damgasını Time nesnesine dönüştürme
t := time.Unix(sec, 0)
fmt.Println(t.UTC())
fmt.Println(t)
}
Sık Yapılan Hatalar ve İyi Pratikler
Hata Örneği: Belirsiz Birimler
// ✗ Yanlış: zaman damgası birimi belirsiz
const timestamp = 1692268800;
const date = new Date(timestamp); // Hata: milisaniye olarak yorumlanır, 1970 görünür
// ✓ Doğru: birimleri açıkça belirtin
const timestampSec = 1692268800;
const timestampMs = 1692268800000;
const dateFromSec = new Date(timestampSec * 1000);
Alan Adlandırma İyi Pratiği
log_entry = {
"timestamp_ms": 1692268800123, # Milisaniye düzeyi
"timestamp_iso": "2023-08-17T16:00:00Z", # ISO 8601 UTC
"event_type": "user_login",
"user_id": 12345
}
Zaman Dilimi Yönetimi Tuzakları
Zaman dilimleriyle çalışırken karşılaşılan dört temel tuzak vardır:
- Yerel saat ile UTC’yi karıştırmak — Unix zaman damgaları her zaman UTC tabanlıdır; yerel saate dönüşümü yalnızca görüntüleme aşamasında yapın
- Zaman dilimi bilgisini kaydetmemek — Belirsizlik yaratır; her zaman UTC olarak depolayın veya offset bilgisini ekleyin
- Sistemler arası zaman dilimi tutarsızlığı — Tüm sistemler aynı zaman dilimi referansını kullanmalıdır (önerilen: UTC)
- DST offset’lerini elle hesaplamak — Yerleşik kütüphanelere güvenin, sabit kodlu değerler kullanmayın
Önerilen yaklaşım: “Standartlaştırılmış depolama, yerelleştirilmiş gösterim.” Depolama ve aktarım aşamalarında tutarlılığı sağlamak için UTC veya Unix zaman damgası kullanın; gösterim sırasında veriyi kullanıcının zaman dilimine göre biçimlendirin.
Yaz Saati Uygulaması (DST) Sorunları
DST iki sorunlu zaman dilimi yaratır:
- Atlanan zaman: DST başladığında saatler ileri atlar. Örneğin 02:00 doğrudan 03:00’e atlar ve 02:30 hiç var olmaz.
- Tekrarlayan zaman: DST sona erdiğinde 01:00–01:59 aralığı iki kez görünür ve belirsizlik oluşur.
Unix zaman damgaları kendi başlarına süreklidir ve DST’den etkilenmez; ancak yerel saate dönüşümler dikkatli ele alınmalıdır.
Loglama, Veri Tabanı ve API’ler için İyi Pratikler
Loglama Sistemleri
UTC zaman dilimi + ISO 8601 biçimini standart hâline getirin; gerektiğinde milisaniye veya mikrosaniye hassasiyetli zaman damgaları ekleyin.
Veri Tabanları
Zaman dilimi destekli yerel takvim türlerini tercih edin; sayısal zaman damgaları için BIGINT kullanın ve alan adında birimi açıkça belirtin (örneğin *_epoch_ms).
API’ler
Biçim ve birimleri net olarak tanımlayın. Dış arayüzler ISO 8601 (okunabilir, zaman dilimi içerir) kullanmalı; iç sistemler birimi belgelenmiş sayısal zaman damgalarını kullanabilir.
Sık Karşılaşılan Hata Senaryoları
- 13 basamaklı ayrıştırma hatası: Saniye bekleyen fonksiyonlara verilen milisaniye zaman damgaları taşmaya yol açar. Önce basamak sayısına bakarak birimi belirleyin.
- Biçim uyumsuzluğu: Geçersiz tarihler, eksik zaman dilimleri veya DST geçiş anları ayrıştırma hatalarına neden olur.
- Zaman dilimi offset’leri: Tam saatlik sapmalar (±8 sa) genelde standartlaştırma sorununa işaret eder. İç süreçlerde UTC kullanılması önerilir.
- Sayısal taşma: 32 bitlik sistemler 2038 sınırıyla karşılaşır; 64 bitlik tam sayılara öncelik verin.
Sıkça Sorulan Sorular
Neden 1 Ocak 1970?
Unix işletim sistemi geliştirme süreci 1970’te başladı ve bu yıl, tam bir on yıllık başlangıç noktasıydı — hatırlanması ve hesaplanması kolaydı. 32 bitlik tam sayılar 1970’ten 2038’e kadar olan tarihleri temsil edebiliyordu; bu da o dönem için yeterliydi.
Saniye ile milisaniyeyi nasıl ayırt ederim?
Üç yöntem var: basamak sayısını kontrol edin (10 basamak = saniye, 13 = milisaniye, 16 = mikrosaniye, 19 = nanosaniye), değeri ayrıştırıp tarihin makul olup olmadığını doğrulayın ya da çevrimiçi bir dönüştürme aracından yararlanın.
2038 sorunu hâlâ önemli mi?
64 bitlik tam sayılara dayanan modern sistemler bu sorunu büyük ölçüde çözmüş durumdadır. Yaygın programlama dilleri 64 bitlik zaman damgalarını zaten destekliyor. Eski 32 bitlik sistemler ve gömülü cihazlar yine de dikkat gerektirebilir.
DST neden sorun çıkarır?
Atlanan saatlerden gelen zaman süreksizliği ve tekrarlayan saatlerden doğan tekrarlar, ayrıştırmada belirsizlik yaratır. Farklı sistemler belirsiz saatleri farklı stratejilerle ele alır. Çözüm: dahili olarak UTC kullanın ve yerel saate dönüşümü yalnızca gösterim sırasında yapın.
JavaScript ve Python zaman damgaları neden farklı?
JavaScript’te Date.now() milisaniye döndürür (13 basamak); Python’da time.time() saniye döndürür (mikrosaniye hassasiyetli kayan nokta değeri). Dönüşüm için 1000’e bölmek veya 1000 ile çarpmak gerekir.
Güncel Eğilimler ve Geleceğe Bakış
- Daha yüksek hassasiyet: Finansal işlemler, IoT ve gerçek zamanlı sistemler nanosaniye düzeyinde doğruluk talep ediyor
- Dağıtık senkronizasyon: NTP ve PTP protokolleri doğruluğu artırıyor
- Blockchain zaman damgaları: Kripto paralar, manipülasyona dayanıklı ve yüksek hassasiyetli zaman damgaları gerektirir
- Performans optimizasyonu: SIMD komutları, bellek önbellekleri ve paralel işleme, dönüşümleri hızlandırır
Kendiniz Deneyin
Unix Zaman Damgası Dönüştürücümüzle Unix zaman damgalarını anında dönüştürün — saniye, milisaniye ve mikrosaniyeyi otomatik algılar. %100 tarayıcınızda çalışır.
PostgreSQL ile mi çalışıyorsunuz? Postgres’e özgü zaman dilimi tuzakları için PostgreSQL timestamp Sütununda Tam Olarak Ne Saklanır? yazısını okuyun.
Sonuç
Bu kapsamlı rehber Unix zaman damgalarının temellerini ele aldı — epoch kökeninden çoklu hassasiyet dönüşümlerine, diller arası uygulamalardan zaman dilimi yönetimine, DST tuzaklarından loglama, veri tabanı ve API tasarımına dair mühendislik iyi pratiklerine kadar. Akılda kalması gereken temel nokta: UTC olarak depolayın, yerel saatte gösterin ve zaman damgası birimleri konusunda her zaman açık olun.
Zaman damgaları, geliştirici araç setinin yalnızca bir parçası. Kodlama, özet alma ve veri dönüşümü için temel geliştirici araçları rehberini de keşfedin.