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.
1-- Etkinlik tablosu oluşturma2CREATE TABLE events (3id INT PRIMARY KEY,4event_name VARCHAR(100),5event_time DATETIME, -- UTC olarak saklanır6created_at DATETIME DEFAULT CURRENT_TIMESTAMP7);89-- Veri ekleme (UTC olarak)10INSERT INTO events (id, event_name, event_time) 11VALUES (1, 'Toplantı', '2025-01-15 12:30:00'); -- UTC1213-- Türkiye saatine dönüştürme (UTC+3)14SELECT 15event_name,16event_time,17DATE_ADD(event_time, INTERVAL 3 HOUR) AS turkiye_saati18FROM events;Çıktı:
1event_name | event_time | turkiye_saati2Toplantı | 2025-01-15 12:30:00 | 2025-01-15 15:30:00PostgreSQL saat dilimi desteği daha iyi. TIMESTAMPTZ (timezone ile timestamp) kullanın.
1-- Tablo oluşturma2CREATE TABLE events (3id INT PRIMARY KEY,4event_name VARCHAR(100),5event_time TIMESTAMPTZ -- UTC + saat dilimi bilgisi6);78-- Veri ekleme9INSERT INTO events VALUES (1, 'Toplantı', '2025-01-15 15:30:00+03:00');1011-- UTC olarak görme12SELECT event_name, event_time AT TIME ZONE 'UTC' FROM events;1314-- Türkiye saatine dönüştürme15SELECT 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.
0 yorum