16 puan yazan GN⁺ 2024-08-25 | 5 yorum | WhatsApp'ta paylaş
  • ECMAScript'teki son değişiklikler arasında en dikkat çekici olanlardan biri Temporal önerisi
    • Bu API, FullCalendar ekibinin sunduğu polyfill aracılığıyla zaten kullanılabiliyor
    • Bu API'nin en büyük avantajlarından biri, nihayet "Zoned Date Time"ı ifade eden yerel bir nesnenin gelmiş olması

Zoned Date Time nedir?

  • İnsanların kullandığı tarihleri ele alırken, genellikle zaman dilimini atlayıp yalnızca tarih ve saatten söz ederiz
  • Ancak JavaScript'in Date nesnesi yalnızca sayılarla çalıştığı için tarihin asıl anlamı kaybolur
  • Örneğin, kart ödeme anını kaydetmek isterken birçok kişi şu kodu kullanabilir
    const paymentDate = new Date('2024-07-20T10:30:00');  
    
  • Bu, tarayıcının kullanıcının zaman dilimine (CET) göre milisaniyeleri hesaplaması anlamına gelir. Ancak kaydedilen bilgi zaman dilimine göre farklı yorumlanabilir
  • JavaScript'te tarihlerin UTC değil, artık saniyelerin tamamen yok sayıldığı POSIX olması gibi çok önemli bir gerçeğin yanı sıra, yalnızca sayıların kalması tarihin ilk anlamını da ortadan kaldırır
  • Pek çok kişi UTC ile çalışmanın veya tarihleri ISO formatında iletmenin güvenli olduğunu düşünür, ancak yine de bilgi kaybı yaşanabileceği için bu doğru değildir

UTC yeterli değil

  • ISO formatıyla çalışılsa bile, tarihi gösterirken hâlâ zaman dilimi bilgisi eksik kalır
  • Bir timestamp'i insanların okuyabileceği bir tarihe dönüştüren fonksiyon injective (birebir) değildir
  • Örneğin Madrid'den Sidney'e seyahat edip geri döndüğünüzde, banka işlem geçmişindeki zaman dilimi sorunu kafa karışıklığına yol açabilir

Temporal API'ye giriş

  • Temporal API, tarih ve saati zaman dilimiyle birlikte temsil eden Temporal.ZonedDateTime nesnesini sunar
  • RFC 3339 için bir genişletme önererek, tarihleri string olarak serialize ve deserialize etmek için bir standart tanımlar
  • 1996-12-19T16:39:57-08:00[America/Los_Angeles]
    • Bu string, 19 Aralık 1996 saat 16:39:57'yi ifade eder
    • Offset, UTC'ye göre -08:00'dır (Los Angeles'ın içinde bulunduğu Pasifik Standart Saati, PST)
    • Ayrıca, zaman dilimini bilen uygulamaların dikkate alabilmesi için ilgili time zone'u ("Pasifik Standart Saati") açıkça belirtir
  • Farklı takvim sistemlerini destekler (ör. Budist, Çin, Dangi, Gregoryen, İslami, Pers, Japon vb.)

Temel işlemler

Tarih oluşturma
  • Temporal API, zaman dilimlerini işlemek için güçlü araçlar sunar
  • Örneğin, Temporal.ZonedDateTime nesnesi oluşturulurken zaman diliminin doğru şekilde yansıtılmasını sağlar:
    const zonedDateTime = Temporal.ZonedDateTime.from({  year: 2024,  month: 8,  day: 16,  hour: 12,  minute: 30,  second: 0,  timeZone: 'Europe/Madrid'});  
    
  • Bu sayede zaman dilimi değişikliklerinde veya DST gibi yerel saat ayarlamalarında doğru saat korunabilir
Tarih karşılaştırma
  • ZonedDateTime nesnesi, iki ZonedDateTime değerini karşılaştırmak için compare metodunu sunar:
    const one = Temporal.ZonedDateTime.from('2020-11-01T01:45-07:00[America/Los_Angeles]');  
    const two = Temporal.ZonedDateTime.from('2020-11-01T01:15-08:00[America/Los_Angeles]');  
    Temporal.ZonedDateTime.compare(one, two);  // => -1  
    
Kullanışlı yerleşik özellikler
  • hoursInDay özelliği, ilgili tarihteki gerçek saat sayısını döndürür:
    Temporal.ZonedDateTime.from('2020-03-08T12:00-07:00[America/Los_Angeles]').hoursInDay;  // => 23  (DST başlangıç günü)  
    
Zaman dilimi dönüştürme
  • withTimeZone metodu kullanılarak ZonedDateTime'ın zaman dilimi değiştirilebilir:
    zdt = Temporal.ZonedDateTime.from('1995-12-07T03:24:30+09:00[Asia/Tokyo]');  
    zdt.withTimeZone('Africa/Accra').toString(); // => '1995-12-06T18:24:30+00:00[Africa/Accra]'  
    
Temel aritmetik işlemler
  • .add metodu ile, DST kurallarına göre tarih ekleme veya çıkarma yapılabilir:
    zdt = Temporal.ZonedDateTime.from('2020-03-08T00:00-08:00[America/Los_Angeles]');  
    laterDay = zdt.add({ days: 1 });  // => 2020-03-09T00:00:00-07:00[America/Los_Angeles]  
    
Tarihler arasındaki farkı hesaplama
  • .until metodu, iki zaman arasındaki farkı hesaplar ve Temporal.Duration nesnesi olarak döndürür
    • Örneğin zdt.until(other) şeklinde kullanılabilir

Sonuç

  • Temporal API, JavaScript'te zamanla çalışma biçimini kökten değiştiriyor
  • Bu yazı, insanların okuyabildiği tarihler ile UTC tarihleri arasındaki farkı ve bunun Temporal.ZonedDateTime nesnesiyle nasıl doğru temsil edilebileceğini ele aldı
  • Bir sonraki yazıda Instant, PlainDate, Duration gibi diğer ilgi çekici nesneler incelenecek

GN⁺ görüşü

  • JavaScript geliştiricilerinin uzun süredir zorlandığı tarih ve saat işleme sorunları, Temporal API ile çözülebilir
  • Zaman dilimi ve DST sorunlarını otomatik olarak ele alabilmesi, küresel uygulama geliştirirken çok faydalıdır
  • Mevcut Date nesnesiyle uyumluluk ve geçiş süreci dikkate alınması gereken konular arasında
  • Temporal API, açık ve sezgisel bir şekilde tasarlanmış; ayrıca farklı takvim sistemlerini destekleyerek uluslararasılaştırma açısından da güçlüdür
  • Bu değişimin JavaScript geliştiricilerinin üretkenliğini büyük ölçüde artırması bekleniyor

5 yorum

 
kyc1682 2024-08-26

Nihayet!

 
huiya 2024-08-26

Vay be, global bir hizmet tasarlarken tarihler yüzünden sürekli başım ağrıyordu
Bunu bir kez denemek istiyorum

 
jjpark78 2024-08-26

Gerçekten, sonunda moment ya da dayjs kullanmadan da idare edebilecek miyiz?

 
GN⁺ 2024-08-25
Hacker News görüşleri
  • Javascript'te tarih ve saatlerle uğraşmak çok zor

    • Moment kütüphanesi tarih ve saati birbirine karıştırarak birçok soruna yol açıyor
    • Python'un Arrow kütüphanesi de aynı hatayı yapıyor
    • Rust'ın Chrono kütüphanesi daha öngörülebilir ve daha az kusurlu
    • JS'nin Datei ve Moment kullanımı zor
  • Yeni API'nin JS'nin saat dilimi sorunlarını çözmesi bekleniyor

    • Belirli saat dilimlerini başarıyla parse ederken diğer durumlarda UTC varsayma sorunu var
    • Önceki iş yerimde bu sorun yüzünden büyük zorluk yaşadım
  • Bir zaman damgasını insanların okuyabileceği bir tarihe dönüştüren fonksiyon injective değildir

    • injectivity ve well-definedness kavramları karıştırılıyor
    • Zaman damgası t için tekil bir insan tarafından okunabilir tarih x mevcut değil
  • Zaman işleme zorluk eğrisi hakkında bir şaka

    • Acemiler sadece UTC zaman damgaları kullanır
    • Orta seviye kullanıcılar saat dilimlerinin saklanıp dönüştürülmesi gerektiğini savunur
    • Ustalar tekrar sadece UTC zaman damgaları kullanır
  • Gelecekteki tarih örnekleri daha fazla kullanılsa makale daha ikna edici olurdu

    • Zaman damgası kaydederken sadece UTC ve konum gerekir
    • Banka örneği yalnızca bir UX sorunu, bilgi kaybı değil
  • Zaman işlemlerini anlamadığı için kaygılanan bir kullanıcı

    • Python gibi dillerde zaman işleme sorunlarını anlamak için iyi bir başlangıç kaynağı önerisi istiyor
  • İyi bir datetime standardına sahip olmak mücadelenin yarısıdır

    • Diğer yarısı bunun yaygın şekilde benimsenmesidir
    • Diğer sistemlerle uyumluluk için ISO string'lerine veya unix zaman damgalarına dönüştürmek güvenlidir
  • ISO tarih string'leri doğru bilgiyi yakalamalı

    • JavaScript veya başka bir dilin yerleşik yapılara ihtiyaç duyduğu fikri sorgulanıyor
    • Temporal ve Date basit sorunları karmaşık şekilde çözüyor
  • Bunun Postgres'te nasıl ele alınacağı soruluyor

  • Temporal'ın gerçekten hayata geçirileceğine dair yeterli kanıt yok

    • Birçok umut vadeden JS önerisinde olduğu gibi uzun süredir sadece tartışılıyor