- JavaScript’te
Date nesnesinin sınırlamalarını kökten değiştiren yeni standart Temporal API, 9 yıllık geliştirmenin ardından ECMAScript Stage 4 seviyesine ulaştı
- Temporal, immutable türler, açık zaman dilimi ve takvim desteği, nanosaniye düzeyinde hassasiyet sunarak mevcut
Date yapısındaki belirsizlikleri ve hataları ortadan kaldırıyor
- Bloomberg, Igalia, Microsoft, Google, Mozilla gibi farklı kurumlar spesifikasyon tasarımı ve uygulama için birlikte çalıştı; Rust tabanlı ortak kütüphane
temporal_rs ile çoklu motor iş birliği sağlandı
- Temporal, ZonedDateTime, Instant, PlainDate/Time, Duration gibi ayrıştırılmış türlerle zaman işlemlerini ve uluslararası takvim işlemlerini doğru şekilde destekliyor
- 30 yıllık sorunları çözen bu standart, JavaScript ekosisteminde iş birliği ve açık inovasyonun başarılı bir örneği olarak değerlendiriliyor
JavaScript’te zaman işleme sorunu ve Temporal’ın ortaya çıkışı
- Mevcut
Date nesnesi, 1995’te Java’daki Date yapısının doğrudan taşınmış haliydi; değiştirilebilirlik, tutarsız ay hesaplamaları, belirsiz ayrıştırma gibi nedenlerle onlarca yıl boyunca hatalara yol açtı
- Örnek:
setMonth kullanıldığında ay sonu hesaplama hataları, ISO benzeri dizgelerin ayrıştırılmasında tarayıcıya göre farklı sonuçlar
- 2010’lardan sonra web uygulamaları karmaşıklaştıkça
Date nesnesinin sınırları daha görünür hale geldi
- Geliştiriciler bu sorunları Moment.js gibi harici kütüphanelerle telafi etti, ancak bunun sonucunda bundle boyutu artışı ve bakım yükü ortaya çıktı
- 2017’de Maggie Johnson-Pint, TC39’a Temporal önerisini sunarak standardizasyon sürecini başlattı
TC39 ve sektör iş birliği
- Temporal, 2018’de Stage 1 aşamasından başlayıp 9 yıl içinde Stage 4 (standartlaşma) seviyesine ulaştı
- Bloomberg, büyük ölçekli JavaScript ortamlarında zaman dilimi ve hassasiyet sorunlarını çözmek için sürece aktif biçimde katıldı
- Gereksinimler: kullanıcı tanımlı zaman dilimleri, IANA tabanlı tarihsel zaman dilimi doğruluğu, nanosaniye düzeyinde hassasiyet
- Igalia, Microsoft, Google, Mozilla ve diğerleriyle birlikte spesifikasyon tasarımı ve uygulama yürütüldü
- Philipp Dunkel, Ujjwal Sharma, Philip Chimento, Shane Carr, Justin Grant gibi birçok mühendis şampiyon olarak katkı verdi
Temporal’ın temel türleri ve özellikleri
- Temporal.ZonedDateTime: açık zaman dilimi, takvim ve DST düzeltmesi içeren immutable zaman gösterimi
- Örnek: Londra’da DST geçişi sırasında
01:30 mevcut değilse otomatik olarak 02:30a düzeltilir
- Temporal.Instant: zaman dilimi ve takvim içermeyen mutlak zaman noktası; nanosaniye düzeyinde hassasiyet destekler
- Aynı zaman noktası birden fazla zaman dilimine dönüştürülebilir
- PlainDate / PlainTime / PlainDateTime / PlainYearMonth / PlainMonthDay: zaman dilimi içermeyen “duvar saati” tipi yapılar
- Basit tarih-saat gösterimi veya hesaplamaları için uygundur
- Temporal.Duration: zaman aralığını ifade eder, farklı birimler arasında dönüşüm yapabilir (
total({ unit: "second" }))
- Takvim desteği: İbrani takvimi gibi Gregoryen dışı takvimlerde işlemleri doğru biçimde gerçekleştirir
Uygulama ve standardizasyon süreci
- Temporal, ECMAScript tarihindeki en büyük spesifikasyon eklemelerinden biri olup yaklaşık 4.500 test vakası içeriyor
- Rust tabanlı ortak uygulama
temporal_rs, V8, Boa ve diğer motorlar tarafından ortaklaşa kullanılmak üzere geliştirildi
- Avantajlar: giriş engelinin azalması, uzun vadeli bakım kolaylığı, daha yüksek kod kalitesi
- 2024–2025 döneminde
temporal_rs, testlerin %100’ünü geçti ve çoklu motor iş birliğinin başarılı bir örneği olarak öne çıktı
Destek durumu ve sonraki görevler
- Temporal hâlihazırda Firefox 139, Chrome/Edge 144, TypeScript 6.0 Beta sürümlerinde destekleniyor
- Safari teknik önizleme aşamasında, Node.js 26 ise planlanıyor
- Sıradaki önemli konu, web API’leriyle entegrasyon
- Örnek:
<input type="date"> gibi form öğelerinde Temporal türlerinin desteklenmesi
DOMHighResTimeStamp yerine kullanım olasılığı değerlendiriliyor (Temporal.Now.instant() örneği verilmiş durumda)
İş birliği ve açık inovasyonun sonucu
- Temporal, 9 yıllık çok kurumlu iş birliği ile tamamlanan bir standart olarak,
- Microsoft, Google, Mozilla, Bloomberg, Igalia, Boa gibi çok sayıda paydaşın katkısını içeriyor
temporal_rs, paylaşılan altyapı modelinin başarılı bir örneği olarak,
- yinelenen uygulama maliyetlerini düşürdüğünü, tutarlılığı artırdığını ve inovasyonu hızlandırdığını gösterdi
- Temporal, yalnızca bir API iyileştirmesi değil; JavaScript topluluğunun uzun vadeli teknik borcu birlikte çözebildiğinin bir kanıtı olarak değerlendiriliyor
- 30 yıl sonra JavaScript, nihayet modern bir tarih-saat API’sine kavuşmuş oldu
7 yorum
Zaman hesaplamasının karmaşıklığı, biçim sorunlarından çok, insanlığın felsefesinden, astronominin hassasiyetinden ve kültürden kaynaklanıyor. Hesaplama ise sadece
longile bile kolaydır. Zaman çizelgesinde tarihsel olarak 1 + 1'in 2 etmediği istisnai aralıkların önceden tanımlandığı pek çok yer var; bunun büyük kısmı da güneşle yeryüzünün açısı gibi konuma göre değişen, adeta I Ching'i andıran takvim sistemlerinden geliyor. Böyle durumlarda Kore'nin güneş-ay takvimi ise hiçbir durumda tartışma konusu bile olmadı.Ve buna Kore Astronomi ve Uzay Bilimleri Enstitüsü karar verir.
Nihayet! Ne güzel!!
Nihayet!!
ZonedDateTime...? Yok artık sen de..!
Nihayet
C’nin
time.h’ı -> Java’nınjava.util.Date’i -> js’inDate’iJava’nın joda-time -> JSR 310 ->
java.time-> moment.js -> js Temporal
Akış böyleymiş gibi görünüyor
Hacker News yorumları
anlık zaman (
instant) ile takvim tabanlı datetime arasındaki ayrım sayesindeDateile sık yapılan hataların çoğu neredeyse önlenebiliyorbiraz ayrıntılı olsa da, sabahın 3'ünde bir DST bug'ını düzeltmek için çağrılmaktan çok daha iyi
2012'de başlayan sorun sonunda standart kütüphanede bir çözüm olarak yerini aldı
ilgili tartışmayı bu Google Groups zincirinde görebilirsiniz
fromisoformatdışındaki yollarla tarih ayrıştırmak artık bana fazla sezgisiz geliyorEskiden
ciso8601kullanıyordum ama standarda girdikten sonra her şey çok daha basit ve güvenilir olduözellikle de bunun tamamını aslında tek başına bir gönüllü olarak yapmış olması çok etkileyici
İstemci ve sunucu arasında kod paylaştığım için veri ile mantığı katı biçimde ayırmaya çalışıyorum
tüm veriyi saf JSON olarak tutup serileştirme/deserileştirmeyi kolaylaştırmak istiyorum ama Temporal nesneleri işlev özellikleri taşıyan sınıf örnekleri olduğu için rahatsız edici
date-fnsgibi yalnızca veri nesnelerine saf fonksiyonlar uygulayan yaklaşımın daha iyi olduğunu düşünüyorumJSON.parseile otomatik olarak geri yüklenmezgeliştiricinin ISO dizgesinden doğru nesneyi kendisinin yeniden kurması gerekir
otomatikleştirmek yanlış tiplerle uğraşma riskini artırır
belgedeki Temporal.Instant reviver örneği faydalı olabilir
JSON.parse/stringifyyüzünden prototipin kaybolması yaygın bir meseleama Temporal ekibinin seçiminin doğru olduğunu düşünüyorum. Tarih-saat mantığında, basit veri+fonksiyon yaklaşımından daha önemli olan şey tip güvenliği
işlemleri nesneye bağlamak,
PlainDate'in yanlışlıklaZonedDateTimegibi ele alınmasını önleyebilirtRPCgibi yerlerde sınırdaTemporal.from()vetoString()dönüşümlerini yapan ince bir katman eklemek yeterlibiraz zahmetli ama tip güvenliğinden vazgeçmekten daha iyi bence
Dateörnekleri de aynı soruna sahipDate.toJSONvar ama JSON ayrıştırılırken dizgenin yenidenDate'e çevrilmesi gerekiyorTemporal da aynı şekilde çalışıyor ve
date-fnsde sonuçta yerelDateörnekleri ile uğraşıyor.toString()veTemporal.from()ile kolayca serileştirilebilir / deserileştirilebilirJSON.parse'ın otomatik olarak Temporal nesneleri oluşturacak şekilde değiştirilmesinin fazla ileri giden bir yaklaşım olduğunu düşünüyorumDateile aynı şekilde böyle açıkça işlemek doğru yaklaşımuzun zamandır emek veren tüm şampiyonları kutluyorum
son birkaç yıldır
temporal_rsüzerinde çalışmak keyifliydiJavaScript'in bu radikal önerisi 2018'de ortaya çıktığına göre, Java'nın yaklaşımının ne kadar etkisi olduğunu merak ediyorum
TC39 diğer dillerdeki örnekleri inceledi ama JavaScript'e en uygun yönde uzlaşmaya vardı
bence bu API, 9 yıla yayılan çalışmanın sonunda JS uzmanlarının tasarladığı en olgun uygulama
ilgili detaylara bu HN zincirinde de bakılabilir
Datekodunu C'ye port etti” sözü komikçünkü Java'nın
util.Dateyapısı da aslında neredeyse C'nintime.hAPI'sinin bir portuyduartık Safari sanki IE'nin manevi halefi olmuş gibi
IE'nin sorunu yavaş olması değil, baskın konumdayken duraklamış olmasıydı
şimdi imparatorluk koltuğunda Chrome var ve aslında Safari ile Firefox'a daha çok ihtiyaç var
asıl sorun Chrome'a özel sitelerin giderek artması
DurationMDN belgesine bakınDurationdeniyor