Veritabanı Saat Dilimi Sorunu: UTC Saklama ve Yerel Saat Dönüşümü

Veritabanında saklanan bir tarihi gösterdiğinde saat yanlış görünüyorsa, saat dilimi sorunu yaşıyorsunuz. Çoğu durumda bunun sebebi UTC ve yerel saat arasındaki karışıklıktır.

UTC (Eşgüdümlü Evrensel Saat), tüm dünyada aynıdır. Türkiye'de saat 14:00 iken Japonya'da 22:00'dir. Veritabanında her tarihi UTC olarak kaydetmek, daha sonra herhangi bir saat dilimine dönüştürmeyi basit hale getirir. Aksi takdirde her kullanıcının saat dilimini takip etmek kaos yaratır.

İlk olarak veritabanında DATETIME ya da TIMESTAMP sütunu UTC formatında tutun. Uygulamada veri kaydederken UTC'ye çevirin. Gösterirken de yerel saate geri çevirin.

Sonra, saat dilimi bilgisini saklamak için kullanıcı profiline bir timezone sütunu ekleyin. Örneğin 'Europe/Istanbul' ya da 'UTC+03:00'.

Türkiye'de bir etkinliğin zamanını kaydedelim. Saat 15:30 Türkiye saati (UTC+3), UTC'de 12:30 olur.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1-- Etkinlik tablosu oluşturma
2CREATE TABLE events (
3id INT PRIMARY KEY,
4event_name VARCHAR(100),
5event_time DATETIME, -- UTC olarak saklanır
6created_at DATETIME DEFAULT CURRENT_TIMESTAMP
7);
8
9-- Veri ekleme (UTC olarak)
10INSERT INTO events (id, event_name, event_time)
11VALUES (1, 'Toplantı', '2025-01-15 12:30:00'); -- UTC
12
13-- Türkiye saatine dönüştürme (UTC+3)
14SELECT
15event_name,
16event_time,
17DATE_ADD(event_time, INTERVAL 3 HOUR) AS turkiye_saati
18FROM events;

Çıktı:

1event_name | event_time | turkiye_saati
2Toplantı | 2025-01-15 12:30:00 | 2025-01-15 15:30:00

PostgreSQL saat dilimi desteği daha iyi. TIMESTAMPTZ (timezone ile timestamp) kullanın.

1-- Tablo oluşturma
2CREATE TABLE events (
3id INT PRIMARY KEY,
4event_name VARCHAR(100),
5event_time TIMESTAMPTZ -- UTC + saat dilimi bilgisi
6);
7
8-- Veri ekleme
9INSERT INTO events VALUES (1, 'Toplantı', '2025-01-15 15:30:00+03:00');
10
11-- UTC olarak görme
12SELECT event_name, event_time AT TIME ZONE 'UTC' FROM events;
13
14-- Türkiye saatine dönüştürme
15SELECT event_name, event_time AT TIME ZONE 'Europe/Istanbul' FROM events;

Uygulamada tarihleri her zaman UTC'ye çevirerek kaydedin. Veritabanından çekerken yerel saate dönüştürün. Yaz/kış saati değişimini otomatik yönetmek için 'Europe/Istanbul' gibi bölge adları kullanın; UTC+3 gibi sabit ofset kullanmayın.

Kullanıcı tercihini saklamayı unutmayın; bazıları farklı saat diliminde görmek isteyebilir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz