JavaScript Date'leri sonunda düzeltiliyor
(docs.timetime.in)- 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
Datenesnesi 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.ZonedDateTimenesnesini 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.ZonedDateTimenesnesi 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
ZonedDateTimenesnesi, ikiZonedDateTimedeğerini karşılaştırmak içincomparemetodunu 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
withTimeZonemetodu kullanılarakZonedDateTime'ı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
.addmetodu 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
.untilmetodu, iki zaman arasındaki farkı hesaplar veTemporal.Durationnesnesi olarak döndürür- Örneğin
zdt.until(other)şeklinde kullanılabilir
- Örneğin
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.ZonedDateTimenesnesiyle 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
Datenesnesiyle uyumluluk ve geçiş süreci dikkate alınması gereken konular arasında TemporalAPI, 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
Nihayet!
Bu arada Deno, Temporal API'yi zaten yerleşik olarak sunuyor.
Vay be, global bir hizmet tasarlarken tarihler yüzünden sürekli başım ağrıyordu
Bunu bir kez denemek istiyorum
Gerçekten, sonunda moment ya da dayjs kullanmadan da idare edebilecek miyiz?
Hacker News görüşleri
Javascript'te tarih ve saatlerle uğraşmak çok zor
Datei ve Moment kullanımı zorYeni API'nin JS'nin saat dilimi sorunlarını çözmesi bekleniyor
Bir zaman damgasını insanların okuyabileceği bir tarihe dönüştüren fonksiyon injective değildir
tiçin tekil bir insan tarafından okunabilir tarihxmevcut değilZaman işleme zorluk eğrisi hakkında bir şaka
Gelecekteki tarih örnekleri daha fazla kullanılsa makale daha ikna edici olurdu
Zaman işlemlerini anlamadığı için kaygılanan bir kullanıcı
İyi bir datetime standardına sahip olmak mücadelenin yarısıdır
ISO tarih string'leri doğru bilgiyi yakalamalı
Bunun Postgres'te nasıl ele alınacağı soruluyor
Temporal'ın gerçekten hayata geçirileceğine dair yeterli kanıt yok