🕐
← Rehberlere dön

Unix Zaman Damgası Saat Dilimi Dönüşümü: Pratik Bir Kılavuz

· Etiketler: timezone, dst, utc, time-conversion, unix-timestamp, daylight-saving, epoch

Unix Zaman Damgaları İçin Saat Dilimi Neden Önemlidir?

Unix zaman damgaları kendileri saat diliminden bağımsızdır1785292800 sayısı her yerde aynı anı ifade eder. Karmaşıklık, bu anı görüntüleme, günlük kaydı veya veri analizi için insan tarafından okunabilir yerel saate dönüştürdüğünüzde ortaya çıkar.

Temel ilke: her zaman UTC'de saklayın, yalnızca görüntüleme için dönüştürün. Bu kural, tüm hata kategorilerini ortadan kaldırır ve verilerinizi saat dilimleri arasında taşınabilir hale getirir.

UTC ve Yerel Saat: Farkı Anlamak

UTC (Eşgüdümlü Evrensel Zaman)

UTC birincil zaman standardıdır. Yaz saati için asla değişmez ve dünyanın her yerinde aynıdır. Unix zaman damgaları UTC'de tanımlanır.

Yerel Saat

Yerel saat, belirli bir coğrafi bölge için ayarlanmış UTC'dir. UTC'den sabit bir farkla (örn. Çin Standart Saati için UTC+8) veya değişken bir farkla (örn. Doğu Saati, DST için UTC-5 ile UTC-4 arasında değişir) farklılık gösterebilir.

Fark Problemi

Aynı Unix zaman damgası, gözlemcinin konumuna bağlı olarak farklı yerel saatler üretir:

| Zaman Damgası | UTC | New York (EST) | Tokyo (JST) | Londra (BST) | |-----------|-----|----------------|-------------|--------------| | 1785292800 | 2026-07-19 00:00 | 2026-07-18 20:00 | 2026-07-19 09:00 | 2026-07-19 01:00 | | 1785379200 | 2026-07-19 23:59 | 2026-07-19 19:59 | 2026-07-20 08:59 | 2026-07-20 00:59 |

Yaz Saati Uygulaması (DST)

DST Nedir?

Yaz Saati Uygulaması, akşam gün ışığının daha uzun sürmesi için yaz aylarında saatleri ileri alma uygulamasıdır. Saatler ilkbaharda "ileri alınır" (bir saat kaybedilir) ve sonbaharda "geri alınır" (bir saat kazanılır).

Zaman Damgası Dönüşümüne Etkisi

DST, yerel saat ile UTC arasında değişken bir fark oluşturur. Bu şu anlama gelir:

  1. Aynı yerel saat iki farklı zaman damgasına karşılık gelebilir ("geri alma" geçişi sırasında, 1:00 AM saati iki kez gerçekleşir)
  2. Bazı yerel saatler mevcut değildir ("ileri alma" geçişi sırasında, örn. 2:00 AM asla gerçekleşmez — saatler doğrudan 3:00 AM'e atlar)

Örnek: Belirsiz Saat

Amerika Birleşik Devletleri Doğu Saat Dilimi'nde, Kasım ayının ilk Pazar günü saat 2:00 AM'de, saatler 1:00 AM'e geri alınır. Bu şu anlama gelir:

from datetime import datetime, timezone
import pytz

eastern = pytz.timezone("America/New_York")

# 1:00 AM'in ilk gerçekleşmesi (EDT, UTC-4)
first = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=True)
print(first.timestamp())
# Bir zaman damgası değeri

# 1:00 AM'in ikinci gerçekleşmesi (EST, UTC-5) = 3600 saniye sonra!
second = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=False)
print(second.timestamp())
# first.timestamp() + 3600

Uygulamalarınızda belirsiz geri alma saatini her zaman dikkatli şekilde ele alın. Python'da is_dst/ambiguous bayraklarını veya diğer dillerdeki eşdeğer seçenekleri kullanmak, ince hataları önler.

Saat Dilimleri Arasında Dönüştürme

Çevrimiçi Aracımızı Kullanma

Tek seferlik dönüştürmeler için en basit yaklaşım, sonuçları aynı anda birden fazla saat diliminde gösteren Unix Zaman Damgası Dönüştürücümüzdür.

Linux Komut Satırını Kullanma

# Zaman damgasını birden fazla saat diliminde görüntüleme
TZ="America/New_York" date -d @1785292800
TZ="Europe/London"    date -d @1785292800
TZ="Asia/Tokyo"       date -d @1785292800

# Özel ISO biçimi ile
TZ="UTC" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Çıktı: 2026-07-19 00:00:00 UTC

TZ="Asia/Shanghai" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Çıktı: 2026-07-19 08:00:00 CST

Python Kullanma

from datetime import datetime
from zoneinfo import ZoneInfo  # Python 3.9+

ts = 1785292800

# Birden fazla saat dilimine dönüştürme
timezones = ["America/New_York", "Europe/London", "Asia/Tokyo", "Australia/Sydney"]

for tz_name in timezones:
    tz = ZoneInfo(tz_name)
    dt = datetime.fromtimestamp(ts, tz=tz)
    print(f"{tz_name}: {dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")

JavaScript Kullanma

const ts = 1785292800;
const date = new Date(ts * 1000);

const timezones = [
    "America/New_York",
    "Europe/London",
    "Asia/Tokyo",
    "Australia/Sydney"
];

for (const tz of timezones) {
    const str = date.toLocaleString("en-US", {
        timeZone: tz,
        timeZoneName: "short",
    });
    console.log(`${tz}: ${str}`);
}

Go Kullanma

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Unix(1785292800, 0)
    
    timezones := []string{
        "America/New_York",
        "Europe/London",
        "Asia/Tokyo",
        "Australia/Sydney",
    }
    
    for _, tz := range timezones {
        loc, _ := time.LoadLocation(tz)
        fmt.Printf("%s: %s\n", tz, t.In(loc).Format("2006-01-02 15:04:05"))
    }
}

Yaygın Saat Dilimi Dönüşüm Desenleri

Sunucu Günlüklerini Yerel Saate Dönüştürme

Sunucu günlükleri genellikle zaman damgalarını UTC olarak kaydeder. Bunları analiz ederken, yerel saat diliminize dönüştürün:

# Bir günlük dosyasını okuyun ve zaman damgalarını Pasifik saatinde görüntüleyin
while IFS= read -r line; do
    if [[ $line =~ ^([0-9]+) ]]; then
        ts="${BASH_REMATCH[1]}"
        TZ="America/Los_Angeles" date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
        echo " $line"
    fi
done < server.log

Saat Dilimleri Arası Etkinlikleri Planlama

Etkinlik zamanlarını saat dilimleri arasında paylaşırken, her zaman UTC olarak iletin veya Unix zaman damgasını doğrudan paylaşın. Bu, belirsizliği ortadan kaldırır:

  • "1785292800'de toplantı" belirsizlik içermez
  • "Sabah 9:00 EST'de toplantı" DST geçişleri sırasında belirsiz hale gelir
  • "Sabah 9:00 America/New_York'te toplantı" daha iyidir ancak yine de DST durumunu bilmeyi gerektirir

Veritabanlarında Zaman Damgalarını Saklama

-- Her zaman zaman damgasının kendisini saklayın (saat diliminden bağımsız)
INSERT INTO events (occurred_at, user_id) VALUES (1785292800, 42);

-- VEYA açık bir UTC zaman damgası sütunu ile saklayın
INSERT INTO events (occurred_at_utc, user_id) 
VALUES ('2026-07-19 00:00:00+00', 42);

En İyi Uygulamalar Özeti

  1. UTC'de saklayın, görüntüleme için dönüştürün — Veritabanlarında asla yerel saat saklamayın
  2. IANA saat dilimi adlarını kullanın (örn. America/New_York), kısaltmalar (EST, PST) yerine — kısaltmalar belirsizdir ve DST'yi hesaba katmaz
  3. DST'yi açıkça ele alın — Saat dilimi duyarlı kütüphaneler kullanın; asla manuel olarak saat eklemeyin/çıkarmayın
  4. Her zaman saat dilimi bilgisini iletin — Kullanıcılardan tarih kabul ederken, yalnızca farkı değil saat dilimini toplayın
  5. Sınır tarihlerini test edin — Hataları erken yakalamak için dönüştürme mantığınızı DST geçiş tarihlerinde (hem ilkbahar hem sonbahar) test edin

Saat Dilimi Veritabanı

Sisteminizin saat dilimi verileri, hükümetler DST kurallarını değiştirdikçe yılda birkaç kez güncellenen IANA Saat Dilimi Veritabanı'ndan (Olson veritabanı olarak da adlandırılır) gelir. Sisteminizi güncel tutun:

# Debian / Ubuntu
sudo apt update && sudo apt install tzdata

# macOS
# Yazılım güncellemeleri aracılığıyla otomatik olarak güncellenir

# Veritabanı sürümünüzü doğrulayın
zdump -v /etc/localtime | head -1

Tüm büyük saat dilimlerinde hızlı saat dilimi duyarlı dönüştürmeler için Unix Zaman Damgası Dönüştürücümüzü kullanın.