Skip to content
Bloga Dönün
Eğitimler

Unix Timestamp Rehberi: epoch saniye, ms ve zaman dilimleri

Unix timestamp'i baştan sona: epoch kökeni, saniye/ms/μs dönüşümü, zaman dilimi yönetimi, DST tuzakları ve JS, Python, Go kod örnekleri.

14 dakika okuma

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ı

BirimSaniyedeki AdetBasamakTipik Kullanım Alanları
Saniye (s)110Geleneksel Unix/Linux sistemleri
Milisaniye (ms)1.00013JavaScript, Java, log kayıtları
Mikrosaniye (μs)1.000.00016Dağıtık izleme, veri tabanları
Nanosaniye (ns)1.000.000.00019Go 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:

  1. 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
  2. Zaman dilimi bilgisini kaydetmemek — Belirsizlik yaratır; her zaman UTC olarak depolayın veya offset bilgisini ekleyin
  3. Sistemler arası zaman dilimi tutarsızlığı — Tüm sistemler aynı zaman dilimi referansını kullanmalıdır (önerilen: UTC)
  4. 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.