JavaScript Temporal geliyor
(developer.mozilla.org)- JavaScript’in yeni Temporal nesnesi tarayıcıların deneysel sürümlerine girmeye başlıyor; bu, tarih, saat, süre ve takvim işlemlerini yerleşik API ile daha doğru ve tutarlı biçimde ele almaya yönelik bir değişim
- Mevcut
Date, kullanıcının yerel zamanı ve UTC merkezli yapısı, kararsız ayrıştırma davranışı ve mutable çalışması nedeniyle saat dilimi işlemlerini ve hata ayıklamayı zorlaştırıyordu - Temporal,
Temporal.Instant,Temporal.ZonedDateTime,Temporal.PlainDateTime,Temporal.Duration,Temporal.Nowgibi yapılarla anlık zaman noktası, yerel zaman ve süreyi ayırıyor ve 200’den fazla yardımcı yöntem sunuyor - Kararlı, tarayıcılar arası destek için daha zamana ihtiyaç var; Firefox Nightly’de Temporal,
javascript.options.experimental.temporalayarının arkasından denenebiliyor - MDN’e bu hafta Temporal için 270’ten fazla sayfa dokümantasyon eklendi;
@js-temporal/polyfilliçeren TC39 dokümantasyon sayfasında örnekler bayrak değiştirmeden çalıştırılabiliyor
JavaScript Date’in eski sınırlamaları
- JavaScript 1995’te oluşturulurken
Datenesnesi Java’nın ilkjava.util.Dateuygulamasını kopyaladı; Java bunu 1997’de değiştirdi, ancak JavaScript neredeyse 30 yıl boyunca aynı API’yi korudu - En büyük sorunlar saat dilimi desteğinin eksikliği ve kararsız ayrıştırma davranışı
- Yalnızca kullanıcının yerel zamanı ve UTC destekleniyor
Datenesnesinin kendisi mutable olduğu için takip etmesi zor hatalara yol açabiliyor- Daylight Saving Time (DST) ve geçmiş takvim değişikliklerini aşan hesaplamaları ele almak da zor
- Bu kısıtlamalar nedeniyle birçok geliştirici, uygulamalarında tarih ve saat işlemleri için Moment.js veya date-fns gibi özel kütüphanelere bel bağladı
Temporal’ın değiştirdiği tarih-saat modeli
- Temporal,
Datenesnesinin tam bir alternatifi olarak tasarlandı; tarih ve saat yönetimini daha güvenilir ve öngörülebilir hâle getirmeyi hedefliyor - Saat dilimi ve takvim gösterimlerini destekliyor; dönüştürme, karşılaştırma, hesaplama ve biçimlendirme için yerleşik yöntemler sağlıyor
- API yüzeyinde 200’den fazla yardımcı yöntem bulunuyor; MDN’in Temporal dokümantasyonuna açıklamalar ve örnekler eklendi
Temporal’ın başlıca tipleri
- Temporal, benzersiz bir anı, yerel duvar saati zamanını ve süreyi farklı tiplerle ayırıyor
- Başlıca yapılar şöyle
Temporal.Duration: İki zaman noktası arasındaki farkTemporal.Instant: Zaman damgası olarak ifade edilen benzersiz anTemporal.ZonedDateTime: Saat dilimi içeren tarih-saatTemporal.PlainDateTime: Saat dilimi olmayan tam tarih-saatTemporal.PlainDate: Yalnızca tarihi ifade ederTemporal.PlainYearMonth: Yıl ve ayTemporal.PlainMonthDay: Ay ve günTemporal.PlainTime: Yalnızca saati ifade eder
Temporal.Now: Geçerli zamanı çeşitli sınıf örnekleri veya belirli biçimlerde elde etmeye yarayan API
Örneklerle kullanım biçimi
- Geçerli tarih ve saat ISO string olarak alınabiliyor; birçok yönteme saat dilimi iletilebiliyor
Temporal.Now.plainDateTimeISO()sistem saat dilimindeki geçerli tarih-saati döndürürTemporal.Now.plainDateTimeISO("America/New_York")New York saat dilimindeki geçerli tarih-saati döndürür
- Gregorian dışındaki takvimler de ele alınabiliyor; Hebrew, Chinese, Islamic gibi takvim sistemlerine ait tarihler oluşturulabiliyor
- Chinese takvimindeki
M01ayının 1. günü kullanılarak bir sonraki Chinese New Year hesaplanıyor - Yazının yazıldığı sıradaki örnek çıktıda bir sonraki Chinese New Year
1/29/2025
- Chinese takvimindeki
- Unix Epoch milisaniye zaman damgası
Temporal.Instant.fromEpochMilliseconds()ile bir ana dönüştürülüpTemporal.Now.instant()ile karşılaştırılarak kalan süre hesaplanabiliyor- Örnek zaman damgası
1851222399924içinsmallestUnit: "hour"ile şu andan itibaren kalan süre hesaplanıyor @js-temporal/polyfillçıktısı31,600 hr, Firefox Nightly çıktısı isePT31600H
- Örnek zaman damgası
- Firefox uygulamasındaki
toLocaleStringşu anda locale’e duyarlı string üretmiyor- Bu davranış teknik bir sınırlamadan çok bir tasarım kararına yakın; duration biçimlendirmesinin kendisi mümkün
- polyfill ve Firefox uygulaması ileride birbirine yakınsayabilir
compare()yöntemi dizi sıralamada kullanılabiliyordurations.sort(Temporal.Duration.compare)kullanıldığındaPT1H,PT1H30M,PT1H45M,PT2Hsırasıyla diziliyor
Tarayıcı desteği ve deneme yöntemi
- Temporal desteği deneysel tarayıcı sürümlerine yavaş yavaş dahil edilmeye başladı; şu anda Firefox uygulaması en olgun görünen seçenek
- Firefox’ta Temporal, Nightly sürümünde
javascript.options.experimental.temporalayarının arkasında derleniyor - Uygulama takibi için başlıca tarayıcı issue’ları şöyle
- Firefox: Build temporal in Nightly by default
- Safari: [JSC] Implement Temporal
- Chrome: Implement the Temporal proposal
- Tam uyumluluk durumu MDN’in Temporal object Browser Compatibility section bölümünden kontrol edilebilir
- TC39 Temporal dokümantasyonunda
@js-temporal/polyfillbulunduğu için, herhangi bir tarayıcıda bayrak veya ayar değiştirmeden geliştirici araçları konsolunda örnekler çalıştırılabilir
1 yorum
Hacker News yorumları
Temporal harika. Bir süredir polyfill ile production’da kullanıyorum; mevcut
Date()API’sinde yaşadığım pek çok sorunu çözüyorRust’taki
chrono, Java’daki Joda Time gibi iyi zaman kütüphanelerinden ilham alıp bunları kullanımı rahat bir API’de iyi birleştirmiş gibi hissettiriyorDüz zaman, anlık zaman noktası ve saat dilimi içeren zamanı ayırdığı için biraz daha karmaşık; ama zamanın kendisi karmaşık olduğundan geliştiricinin bu karmaşıklıkla yüzleşmesi gerekiyor
“Bu timestamp’e bir gün ekle” gibi bir işlemde bile bunun hangi saat dilimi temel alınarak yapılacağı mutlaka belirlenmeli; aksi halde yaz saati uygulaması, kullanıcının saat dilimini değiştirmesi veya sunucu saat dilimi farkları yüzünden bug’lar kalır
Sabit offset’li timestamp (
2025-01-01T00:00+02:00) ile belirli bir saat diliminin (Europe/Paris) serileştirme farkını da çözüyorchronoda dahil diğer tarih-saat crate’leriyle karşılaştırmayı da derlemiş: https://docs.rs/jiff/latest/jiff/_documentation/comparison/i...Kişisel olarak Temporal’ın Rust’taki
chronodan büyük ölçüde ilham aldığını söylemek zor; Joda veya günceljava.timeile date-fns ya da Moment.js gibi JavaScript tarih-saat kütüphanelerinin etkisi daha büyük görünüyorEurope/Parisin Fransa’nın geniş bir bölgesi mi yoksa sadece Paris mi olduğunu araştırmaya yanaşmıyor; bunu, Paris’te yaşadığını söylüyormuş gibi hissedip sinirleniyorÇevrimiçi topluluk etkinlikleri gibi şeyleri planlarken bu durum eziyet olmuştu. İnsanlar sabit offset kullanmak istiyor;
CET/CESTgibi ifadeleri sorun etmiyor amaEurope/yourexactcoordinatesgibi şeylerden hoşlanmıyorAslında çoğu saat diliminin epey geniş bölgeleri kapsadığını biliyorum; ama gizliliğini önemseyip yine de “saat” ile “saat dilimi” arasındaki farkı araştırmayı düşünmeyen çok kişi var
chronove Joda Time farklı dönemlerin ürünleri. Rust 1.0 çıktığında Java bu yaklaşımı standart kütüphanedeki java.time ile zaten uygulamıştı ve bu amaç için üçüncü taraf bir kütüphaneye ihtiyaç yoktuDokümanlarda bulmam epey zaman aldı; Temporal.ZonedDateTime.prototype.withTimeZone() bir saat diliminden diğerine dönüştürüyor: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
Temporal.ZonedDateTime.from("2021-08-01T12:00[America/New_York]")ile oluşturulan değeriwithTimeZone("Europe/Paris")içine verirseniz2021-08-01T18:00:00+02:00[Europe/Paris]olurSaat dilimi dönüşümü ve süre işlemleri, bir kütüphanenin mutlaka ele alması gereken temel özellikler; Temporal’ın ikisini de halletmesi güzel. Ancak
Temporal.Durationdaduration.format('H\hmm\m')gibi,1h03müreten özel birformatfonksiyonu yok gibi görünüyor1 yr,3 hours,3mgibi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...icu4x kütüphanesinde bunun bir kısmını daha önce implemente etmiştim
Şu anda TC39’da olgunlaşmakta olan epey fazla öneri var ve Temporal, bir an önce yayımlanmasını istediğim şeylerden biri
Büyük tarayıcıların yeni özellikleri desteklemesi için v8, JSC ve SpiderMonkey mühendislerinin geliştirme emeği gerektiğini bildiğimden, ilerleme sağlayan insanlara gerçekten minnettarım
Sabırsız biri olarak “Records ve Tuples’ı da hemen yapın! Pipe sözdizimi savaşını atlayabilirsiniz!” diye destekleyesi geliyor insanın
Tarayıcı sağlayıcılarının bu noktada yeni ilkel tipler eklenmesine zaten oldukça güçlü biçimde karşı çıktığını anlıyorum. Eşitliğin nasıl çalışması gerektiğine dair zorluklar şu başlıkta açıklanıyor: https://github.com/tc39/proposal-record-tuple/issues/387
BigInt’in başta bu kadar çok kullanılacağını beklemiyordum ama pratikte yapısal eşitliğe sahip koleksiyonlara ihtiyaç duyulan durumlar sürekli ortaya çıkıyor; bu yüzden olmaması üzücü
Yeni ilkel tip eklenmesine yönelik itirazın pattern matching’i de etkilediğini biliyorum, ama nedenini pek bilmiyorum ve o öneriyi daha az takip ediyorum
Pipeline, pattern matching ve Records+Tuples’ın hepsi 4 yılı aşkın süredir üzerinde çalışılan şeyler ve hâlâ 1–2. aşamalarda kalmış durumdalar. Son bir yılda anlamlı ilerleme, pattern matching dışında neredeyse yok gibi görünüyor
Records ve Tuples deposundaki issue’lara göre değer semantiğine, yani
===’in çalışıp çalışamayacağına yönelik itirazlar olmuş. Değer semantiği çıkarılırsa önerinin kullanışlılığı büyük ölçüde azalırBunların 3. aşamaya ulaşması en az 1–2 yıl daha sürebilir ya da hiç ulaşamayabilirler. Yine de dizi gruplama fonksiyonu geldi
Hâlâ 1. aşamada olduğu için ne yazık ki birkaç yıl daha sürecek gibi
AS3’teki Dictionary, nesne referanslarını, string’leri ve sayıları benzersiz anahtar olarak kullanıp her türden değeri bağlayabilen bir tipti. Dictionary nesnesinin kendisi yaşadığı sürece zayıf referans olmaması için çöp toplama da buna göre ele alınıyordu
JavaScript’teki Set’i düşünün; ama belirttiğiniz herhangi bir anahtar türünü güçlü tipli biçimde kullanıyor ve derleme zamanında hata fırlatıyor. O dili özlüyorum
Bu güncellemeler fiilen JavaScript ekosistemini bozdu ve artık geriye yalnızca JS’e derlenen diller kalmış gibi. Hâlâ vanilla JS kullanan biri, assembly ile uygulama yapan biri gibi duruyor
Temporal içinde her saat dilimi verisinin nasıl güncel tutulduğunu merak ediyorum
TC39 bir yerde verileri güncelliyor ve her tarayıcı bu verileri içine kopyalayıp yeni sürüm mü çıkarıyor; kullanıcı yeni verileri içeren tarayıcıya güncelleme yapmadıysa web sitemde yanlış saati mi görecek, merak ediyorum
Örneğin Meksika 2022’de yaz saati uygulamasını kaldırdı: https://en.wikipedia.org/wiki/Time_in_Mexico
pytzveyamoment-timezonegibi üçüncü taraf kütüphanelerde sunucu tarafı kütüphaneyi güncellemek yeterli; standart kütüphane ele alıyorsa dil sürümünü yükseltirsiniz. Ama Temporal ve ziyaretçinin tarayıcısında bunun nasıl olacağını bilmiyorumKullanıcının bilgisayarı da bu veritabanına erişebiliyor ve güncellemeleri ele alıyor olabilir, ama emin değilim. Tarayıcı bu veritabanını ayrıca indirip koruyor da olabilir; uygulamaya göre değişecek gibi
İlgili veritabanı: https://en.wikipedia.org/wiki/Tz_database
Intlyardımcıları nedeniyle yerel ayarları da güncel tutmak zorunda; o taraf araştırılırsa benzer bir cevap bulunabilirtzdbkullanıyorKullanıcı yeni saat dilimi verilerini yansıtmak için tarayıcısını veya sistemini güncellemediyse yanlış saati görebileceği genel olarak doğru görünüyor. Ancak bu, mevcut yaygın uygulamadan pek farklı değil
Alternatif, her uygulamanın kendi
tzdb’sini taşıması olurdu; bazı uygulamalar bunu yapıyor ve haklı olduğu durumlar da var. Ama genelde israf, uygulamalar arası tutarsızlığı artırıyor ve güncelleme döngüsünün de daha yavaş olma ihtimali yüksekBirinin saat dilimini değiştirdiğini algılayan bir olay eklemek gerekiyor
“Programcıların zaman hakkında inandığı yanlışlar” listesine “programcılar kullanım sırasında saat diliminin sabit kaldığına inanır” maddesi de eklenebilir. Gerçekte her gün milyonlarca kişi saat dilimleri arasında hareket ediyor
Elbette kütüphaneler için yararlı olabilir
.Now’ın bir fonksiyon çağrısı olmaması çok üzücü. Özellik olmamalıBir döngü içinde
.Nowbirkaç kez değerlendirilirse her seferinde farklı bir değer çıkabilir; bu beklenmedik bir şeyC# da aynı tercihi yaptı ve yapmamalıydı: https://ericlippert.com/2014/05/19/when-should-i-write-a-pro...
Now, gerçek değerleri alan fonksiyonların ad alanı; örneğinNow.instant()gibiTemporal önerisini gerçekten beğeniyorum ama bir şey takılıyor. Karşılaştırmada referans eşitliğine dayanıyor
Yani
Temporal.Instant.from('2020-01-01') != Temporal.Instant.from('2020-01-01')oluyorBu özünde kötü değil, ama bu nesneleri
Mapanahtarı olarak kullanma ya daSetiçinde toplama olanağını fiilen ortadan kaldırıyor. Neden böyle bir karar verdiklerini anlıyorum ama mümkün olmaması üzücüBir gün Records ve Tuples gerçekten çıkarsa, belki buna dayalı bir sürüm oluşabilir
==ile referans dışı eşitliğe sahip olan var mı?.epochMillisecondsdeğeriniMap/Setanahtarı ya da elemanı olarak kullanmak mümkün görünüyor. AncakMapiçinde saat dilimi verisini korumak ya daInstantüzerinde ek işlemler yapmak gerekiyorsa, değer tarafında özgünInstant’ı saklamak gerekirSetiçinMap{v.epochMilliseconds:v}gibi kullanarakInstant’ı koruyabilirsinizHarika değil, ama bu Temporal’dan çok JavaScript’in kendisini suçlamamız gereken bir sorun. Runtime’ın bunu halletmesini de sağlayabilirsiniz, ama o zaman polyfill başarısız olur
Map/Setiçinde kullanmak kayan noktalı sayılarıMap/Setiçinde kullanmaya benzer; genelde kötü bir fikirString()ya da'2020-01-01'kullansak olmaz mı?Mevcut API ile birlikte çalışan bir karşılaştırma fonksiyonu sağlamak sağlam bir tasarım. Yeni bir tip eklerken zorunlu okuma şartı yapılacak kadar iyi
Örneğin
Temporal.Duration.compare’ısort’a verirsenizPT1H,PT1H30M,PT1H45M,PT2Hsırasıyla sıralayabilirsiniz. Tasarımcıları alkışlıyorumTemporaladının Moment, Datetime gibi genel zaman nesneleriyle çakışmayı önleme amacı taşıdığını anlıyorum, ama isim pek iyi değilİlk gördüğümde çöp toplama kontrolü gibi bir şey sandım
temporal, sonsuzluğun karşıtı olarak zamana dair olan, dilbilgisinde zaman/kip ayrımıyla ilgili olan veya mekândan ayrılan zamanla ilgili olan anlamlarına gelir: https://www.merriam-webster.com/dictionary/temporalKulağa iyi bir isim gibi geliyor
Öncelikle
Temporalbir isim değil, sıfat. Zamanla ilgili ama sezgisel olarak tam oturmuyorDaha da önemlisi, eski kodlarla çakışma olasılığını azaltmak için garip bir isim seçerseniz, zaman geçtikçe dil daha da opaklaşır
PromiseveGeneratoreklendiğinde de bu nesne adlarını kullanan çok sayıda kütüphane vardı. Ayrılmış sözcüklerin aksine yerleşik nesnelerin üzerine yazılabildiği için büyük bir sorun olmadıStandart komitesinin dilin uzun vadeli sağlığı için kararlılıkla
Timeadını kullanması gerektiğini düşünüyorumElbette bu tartışma artık geride kaldı ve tarayıcı üreticileriyle JS motoru uygulayıcıları anlaşmış olmalı
DateV2bile daha iyi olurduGeriye dönük uyumluluğun gerektiğini anlıyorum ama
Temporalın tınısı kötü.DateTimeJS standardında olan bir isim de değil; neden onu kullanmadıklarını bilmiyorum. O zamana kadarconst DateTime = Temporalkullanırım gibi görünüyorİlgili yazılar:
JavaScript Temporal Is Coming - https://news.ycombinator.com/item?id=42809834 - Ocak 2025, 18 yorum
Mozilla: Temporal (Limited Availability) - https://news.ycombinator.com/item?id=42776548 - Ocak 2025, 1 yorum
Is It Time for the JavaScript Temporal API? - https://news.ycombinator.com/item?id=29712118 - Aralık 2021, 100 yorum
Temporal: Getting started with JavaScript's new date time API - https://news.ycombinator.com/item?id=27661667 - Haziran 2021, 194 yorum
JavaScript Temporal - https://news.ycombinator.com/item?id=27395236 - Haziran 2021, 1 yorum
JavaScript Proposal Temporal for Dates is now stage 3 - https://news.ycombinator.com/item?id=26432346 - Mart 2021, 1 yorum
Büyük geminin yön değiştirmesi yavaştır sözü tam da buna uyuyor