Frontend geliştiriciler olarak tarih ve saat işlemleriyle uğraşmak, kariyerimizin bir noktasında mutlaka başımızı ağrıtan bir konu olmuştur. Özellikle global kullanıcıları olan bir uygulama geliştiriyorsanız veya Amerika Birleşik Devletleri gibi tek bir ülke sınırları içinde bile birden fazla saat dilimi (ve eyaletlere göre değişen yaz saati uygulaması) olan bir yapıyı kurguluyorsanız, JavaScript'in standart Date objesi genellikle yetersiz kalır.
Geçtiğimiz günlerde, kullanıcıların farklı ülkelerdeki anlık saatleri takip edebileceği, tarayıcı tabanlı bir araç geliştirirken bu meşhur "Timezone" kabusuyla yüzleştim. Bu yazıda, projeyi ağırlaştıracak devasa kütüphaneler (örneğin Moment.js) yüklemeden, modern JavaScript API'leri ile bu sorunu nasıl çözdüğümü ve performansı nasıl optimize ettiğimi adım adım anlatacağım.
Problem: Neden Sadece new Date() Yetmiyor?
Eğer sadece kullanıcının yerel saatini göstermek isterseniz new Date() harika çalışır. Ancak kullanıcınız Türkiye'de yaşarken ona anlık olarak Amerika'nın farklı bölgelerindeki saati göstermek isterseniz işler anında karışır.
Çünkü bu basit görünen işlemin arkasında şu hesaplamalar yatar:
İlgili şehrin veya eyaletin UTC/GMT sapması (Offset).
O eyaletin Yaz Saati Uygulamasına (DST - Daylight Saving Time) geçip geçmediği (örneğin Arizona'nın büyük bir kısmı DST uygulamazken, komşusu Utah uygular).
Sunucu saati ile istemci (kullanıcı) saati arasındaki uyuşmazlıklar.
Çözüm: Intl.DateTimeFormat API'sinin Gücü
Neyse ki modern tarayıcılar artık Internationalization API ile birlikte geliyor. Bu harika API, saat dilimi dönüşümlerini ve yaz saati karmaşasını bizim yerimize işletim sistemi veri tabanına (IANA timezone database) dayanarak arka planda çözüyor.
İşte belirli bir zaman dilimindeki saati en doğru şekilde almak için yazdığım temel fonksiyon:
/**
* Belirtilen IANA zaman dilimine göre anlık saati döndürür.
* @param {string} timeZone - Örn: 'America/New_York'
* @returns {string} - Formatlanmış saat (Örn: "14:30:45")
*/
function getLocalizedTime(timeZone) {
const options = {
timeZone: timeZone,
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false // 24 saat formatı kullanmak için
};
// Formatlayıcıyı oluştur ve mevcut anı (new Date) geçir
const formatter = new Intl.DateTimeFormat('tr-TR', options);
return formatter.format(new Date());
}
Örnek Uygulama: Amerika Kıtası Saatlerini Hesaplamak
Amerika, kıta içinde 4 farklı ana saat dilimi kullanıyor (Eastern, Central, Mountain ve Pacific). Yukarıdaki fonksiyonumuzu kullanarak bu bölgelerin anlık saatlerini çok rahat çekebiliriz:
// New York (Doğu Zaman Dilimi - EST)
const timeNewYork = getLocalizedTime('America/New_York');
console.log(`New York Saati: ${timeNewYork}`);
// Chicago / Texas (Merkez Zaman Dilimi - CST)
const timeChicago = getLocalizedTime('America/Chicago');
console.log(`Chicago Saati: ${timeChicago}`);
// Los Angeles (Pasifik Zaman Dilimi - PST)
const timeLosAngeles = getLocalizedTime('America/Los_Angeles');
console.log(`Los Angeles Saati: ${timeLosAngeles}`);
Performans İpucu: DOM'u Saniyede Bir Yormamak
Eğer ekranda saniyeleri de akan canlı bir saat yapıyorsanız, ilk akla gelen çözüm setInterval ile her saniye getLocalizedTime fonksiyonunu çağırmaktır. Ancak Intl.DateTimeFormat objesini her saniye yeniden oluşturmak hafıza (memory) ve işlemci açısından maliyetlidir.
Bunun yerine şu optimizasyonu kullandım:
Sayfa yüklendiğinde Intl API'si ile net saati (saat, dakika, saniye) bir kez çekiyorum. Ardından saniyeyi basit bir JavaScript değişkeni olarak her saniye 1 artırıyorum. Sadece dakika değiştiğinde (saniye 59'dan 00'a geçerken) senkronizasyon için API'yi tekrar çağırıyorum. Bu sayede tarayıcıyı hiç yormadan akıcı bir deneyim elde ediyorum.
Canlı Örnek: Bu Mantığı Nasıl Bir Ürüne Dönüştürdüm?
Öğrendiğim bu yöntemleri ve performans optimizasyonlarını sadece test etmekle kalmadım; tamamen tarayıcı tabanlı çalışan, sıfır gecikmeli bir Dünya Saati aracı geliştirdim.
Özellikle arama motorlarında sıkça aratılan anahtar kelimeleri hedefleyerek, kullanıcıların kafa karışıklığı yaşamadan anında cevap bulabileceği dinamik sayfalar oluşturdum. Eğer bu kodların canlıda nasıl çalıştığını, arayüzde (UI) nasıl render edildiğini incelemek isterseniz projeme göz atabilirsiniz:
- Tüm Amerika kıtasının saat dilimi haritası ve canlı saatleri için: Amerika'da şu an saat kaç
- Doğu yakası için geliştirdiğim spesifik araç: New York saat kaç
- Batı yakasındaki saat farkını gösteren araç: Los Angeles saat kaç
Tarih ve saat işlemleri için dışa bağımlılığı azaltmak, uygulamanızın yüklenme süresini (bundle size) inanılmaz derecede rahatlatıyor. Siz kendi projelerinizde Timezone hesaplamaları için hangi yöntemleri veya optimizasyonları kullanıyorsunuz? Dış kütüphanelere (date-fns, dayjs vb.) hala mecbur hissediyor musunuz?
Yorumlarda buluşalım!
Top comments (0)