Date Yerine Temporal

Yayınlanma Tarihi:
Date Yerine Temporal

Zaman üzerinde kontrolümüzün olmadığı ve hatta olamayacağı da bir konsepttir.

JavaScript geliştiricileri olarak yıllardır kolektif bir travmayı paylaşıyoruz: Date objesi.

Tutarsız ayrıştırma kuralları, öngörülemeyen saat dilimi dönüşümleri ve bir tarihe birkaç gün eklemek gibi temel bir işlem için bile gereken karmaşık kodlar.

Bu kaosu düzeltmek için Moment.js gibi devasa kütüphaneler kullanılır oldu. Sonra Moment şişti, Day.js veya date-fns gibi “tree-shakeable”(yani kullanılmayan kodları atabilen) alternatiflere geçtik. Ama günün sonunda hepimiz şunu istiyorduk: Neden JavaScript native olarak bunu düzgün yapamıyor?

İşte Temporal API burada devreye giriyor. Bu sadece Date objesinin makyajlanmış hali değil; tarih ve zaman kavramının sıfırdan, doğru matematik ve doğru mantıkla inşa edilmiş hali denebilir.

Minik bir not: Yazının sonunda bahsediyorum ama şu anda Chrome ve Firefox’ta Temporal desteği gelmiş durumda yazıdaki kodları tarayıcı konsolunuzda deneyebilirsiniz.

1. Değişmezlik (Immutability)

Date’in en büyük günahı objelerin değiştirilebilir (mutable) olmasıydı. Bir tarihi kopyalamadan üzerinde işlem yaparsanız orijinal veriyi de bozardınız. Bu durum özellikle büyük uygulamalarda takip edilmesi zor olan hatalara yol açıyordu.

Eski Yöntem (Date - HATA):

const randevu = new Date('2024-01-10');
const hatirlatma = randevu; // Referans kopyalandı!

hatirlatma.setDate(hatirlatma.getDate() - 1); // 1 gün geri çek

console.log(randevu.toISOString()); // 2024-01-09 Orijinal randevu bozuldu.

Temporal Yöntemi (Immutable - DOĞRU): Temporal doğası gereği “immutable” çalışır. Her işlem her zaman yeni bir değer döndürür.

const randevu = Temporal.PlainDate.from('2024-01-10');
const hatirlatma = randevu.subtract({ days: 1 });

console.log(randevu.toString());    // 2024-01-10 (Hâlâ aynı, güvende)
console.log(hatirlatma.toString()); // 2024-01-09 (Yeni obje)

2. “Saat” ile “Tarih” Ayrımı (Type Safety)

Date objesi her zaman her şeyi içerir: Yıl, Ay, Gün, Saat, Dakika… Ama bazen sadece bir doğum gününe ihtiyacınız olduğunda saat bilgisi gereksizdir ve zaman dilimi kaymaları yüzünden bir ülkede ayın 10’uyken diğerinde 9’u olarak gözükebilir.

Temporal, durumu kullanım amacına göre (işletim zamanı vs. insan zamanı) net nesnelerle ayırır:

  • Temporal.Instant: Zaman içindeki kesin bir an (makine zamanı). API’den dönen zaman damgaları için idealdir.

    const instant = Temporal.Now.instant();
    console.log(instant.toString());
    // Çıktı: 2026-01-24T06:30:00.000000000Z
    
  • Temporal.PlainDate: Sadece tarih (1938-11-10). Saat dilimi ve saat bilgisi yok. Doğum günleri ve özel günler için.

    const date = Temporal.PlainDate.from('1938-11-10');
    console.log(date.toString());
    // Çıktı: 1938-11-10
    
  • Temporal.PlainTime: Sadece saat (09:05). “Her gün 08:00’de alarm çalsın” demek için.

    const time = Temporal.PlainTime.from('09:05');
    console.log(time.toString());
    // Çıktı: 09:05:00
    
  • Temporal.ZonedDateTime: Belirli bir saat dilimindeki tam tarih ve saat. DST (Yaz saati) kurallarını otomatik yönetir.

    const zdt = Temporal.Now.zonedDateTimeISO('Europe/Istanbul');
    console.log(zdt.toString());
    // Çıktı: 2026-01-24T09:30:00+03:00[Europe/Istanbul]
    
  • Date’in aksine aylar artık 1’den başlıyor.

    Temporal.PlainDate.from({ year: 2025, month: 1, day: 1 });
    

3. Matematik ve Taşma (Overflow) Yönetimi

Bir tarihe “1 ay” eklemek sandığınızdan zordur. 31 Ocak’a 1 ay eklerseniz ne olur? 28 Şubat mı? 2 Mart mı? Date objesi burada “taşma” yaparak sizi 2 Mart’a atar. Temporal ise kontrolü size verir.

const ocakSonu = Temporal.PlainDate.from('2024-01-31');

// Varsayılan: En yakın geçerli güne sabitler (constrain)
const subatSonu = ocakSonu.add({ months: 1 }); 
console.log(subatSonu.toString()); // 2024-02-29 (Artık yıl)

// İsterseniz hata fırlatmasını da sağlayabilirsiniz
const noOverflow = ocakSonu.add({ months: 1 }, { overflow: 'reject' });

4. Timezone Kabusu ve RFC 9557

Date sadece iki şeyi bilir: UTC ve yerel saatiniz. Başka bir ülkenin saatine göre işlem yapmak kütüphane olmadan imkansızdır. Temporal ise IANA timezone veritabanını native olarak kullanır.

const now = Temporal.Now.instant();

// New York ve İstanbul saatine çevrim
const nyTime = now.toZonedDateTimeISO('America/New_York');
const istTime = now.toZonedDateTimeISO('Europe/Istanbul');

console.log(nyTime.toString()); 
// Çıktı: 2024-01-23T01:51:00-05:00[America/New_York]

Bu çıktı formatı (ISO 8601 uzantısı), verinin “hangi timezone’a ait olduğunu” standart bir string içinde saklamamıza olanak tanır.

Şu anda neredeyiz?

Temporal şu an Stage 3 aşamasında, yani standartlaşmaya çok yakın. Tarayıcılar (Chrome 144+, Firefox 139+) desteğe başladı bile. Tüm ortamlarda güvenle kullanmak için bir polyfill ile şimdiden başlayabilirsiniz:

npm install @js-temporal/polyfill

Backend’de Temporal

Deno şu anda unstable olarak Temporal API’sini destekliyor. Çok yakında stable olacak. Deno Temporal Docs #31873 #31928

Node.js tarafında anladığım kadarıyla Rust desteği bekleniyor Node.js Temporal Issue

Bun tarafında ne olduğunu anlayamadım :D Bun Temporal Issue

Bu yazı şu tweeti görmem sonucu adını duyup meraktan doğan araştırmalar sonucu yarı ai-assisted şekilde yazılmıştır.

Kaynaklar