- Standar baru Temporal API, yang secara mendasar menggantikan keterbatasan objek Date di JavaScript, telah mencapai ECMAScript Stage 4 setelah 9 tahun pengembangan
- Temporal menyediakan tipe immutable, dukungan zona waktu dan kalender yang eksplisit, serta presisi tingkat nanodetik, sehingga menghilangkan ambiguitas dan kesalahan pada Date lama
- Berbagai organisasi seperti Bloomberg, Igalia, Microsoft, Google, Mozilla berkolaborasi dalam perancangan spesifikasi dan implementasi, serta mewujudkan kolaborasi multi-engine melalui library bersama berbasis Rust
temporal_rs
- Temporal mendukung operasi waktu dan penanganan kalender internasional secara akurat melalui tipe yang lebih terperinci seperti ZonedDateTime, Instant, PlainDate/Time, Duration
- Standar ini, yang menyelesaikan masalah selama 30 tahun, dinilai sebagai contoh sukses kolaborasi dan inovasi terbuka dalam ekosistem JavaScript
Masalah penanganan waktu di JavaScript dan kemunculan Temporal
- Objek Date lama merupakan port langsung dari Date milik Java pada 1995, dan selama puluhan tahun menjadi sumber bug karena sifat mutable, perhitungan bulan yang tidak konsisten, serta parsing yang ambigu
- Contoh: kesalahan perhitungan akhir bulan saat memakai
setMonth, serta hasil parsing string mirip ISO yang berbeda antar-browser
- Sejak 2010-an, ketika aplikasi web makin kompleks, keterbatasan Date menjadi semakin terasa
- Para pengembang menutupi masalah ini dengan library eksternal seperti Moment.js, tetapi hal itu menambah ukuran bundle dan beban pemeliharaan
- Pada 2017, Maggie Johnson-Pint mengajukan proposal Temporal ke TC39, menandai dimulainya pembahasan standardisasi
Kolaborasi TC39 dan industri
- Temporal dimulai dari Stage 1 pada 2018 dan mencapai Stage 4 (standarisasi) setelah perjalanan 9 tahun
- Bloomberg terlibat aktif untuk menyelesaikan masalah zona waktu dan presisi di lingkungan JavaScript skala besar
- Kebutuhan: zona waktu kustom, akurasi zona waktu historis berbasis IANA, dan presisi tingkat nanodetik
- Bersama Igalia, Microsoft, Google, Mozilla dan lainnya, mereka mengerjakan desain spesifikasi serta implementasi
- Banyak engineer seperti Philipp Dunkel, Ujjwal Sharma, Philip Chimento, Shane Carr, Justin Grant ikut berperan sebagai champion
Tipe dan fitur utama Temporal
- Temporal.ZonedDateTime: representasi waktu immutable dengan zona waktu, kalender, dan koreksi DST yang eksplisit
- Contoh: saat transisi DST di London, jika
01:30 tidak ada, nilainya otomatis dikoreksi menjadi 02:30
- Temporal.Instant: representasi titik waktu absolut tanpa zona waktu atau kalender, dengan dukungan presisi tingkat nanodetik
- Titik waktu yang sama dapat dikonversi ke berbagai zona waktu
- PlainDate / PlainTime / PlainDateTime / PlainYearMonth / PlainMonthDay: tipe "jam dinding" tanpa zona waktu
- Cocok untuk tampilan atau perhitungan tanggal dan waktu sederhana
- Temporal.Duration: representasi interval waktu, dengan konversi lintas satuan yang fleksibel (
total({ unit: "second" }))
- Dukungan kalender: dapat menangani operasi kalender non-Gregorian seperti kalender Ibrani secara akurat
Proses implementasi dan standardisasi
- Temporal merupakan penambahan spesifikasi terbesar dalam sejarah ECMAScript, dengan sekitar 4.500 test case
- Implementasi bersama berbasis Rust
temporal_rs dikembangkan sehingga V8, Boa, dan engine lain dapat memakainya bersama
- Keuntungan: menurunkan hambatan masuk, memudahkan pemeliharaan jangka panjang, dan meningkatkan kualitas kode
- Sepanjang 2024~2025,
temporal_rs berhasil lulus 100% pengujian dan dinilai sebagai contoh sukses kolaborasi multi-engine
Status dukungan dan tantangan berikutnya
- Temporal sudah didukung di Firefox 139, Chrome/Edge 144, TypeScript 6.0 Beta
- Safari masih pada tahap technology preview, dan Node.js 26 dijadwalkan menyusul
- Tantangan berikutnya adalah integrasi dengan Web API
- Contoh: dukungan tipe
Temporal pada elemen form seperti <input type="date">
- Juga sedang dipertimbangkan sebagai pengganti
DOMHighResTimeStamp (dengan contoh penggunaan Temporal.Now.instant())
Hasil kolaborasi dan inovasi terbuka
- Temporal adalah standar yang diselesaikan melalui kolaborasi multi-organisasi selama 9 tahun, dengan partisipasi dari
- Microsoft, Google, Mozilla, Bloomberg, Igalia, Boa dan banyak pihak lain
temporal_rs menjadi contoh sukses model infrastruktur bersama, dengan
- pembuktian pengurangan biaya implementasi ganda, peningkatan konsistensi, dan percepatan inovasi
- Temporal dinilai bukan sekadar perbaikan API, tetapi juga bukti kolaborasi komunitas JavaScript dalam menyelesaikan utang teknis jangka panjang
- Setelah 30 tahun, JavaScript akhirnya memiliki API tanggal dan waktu modern
7 komentar
Kompleksitas perhitungan waktu jauh lebih banyak berasal dari filsafat manusia, presisi astronomi, dan budaya, daripada sekadar masalah format. Perhitungannya sendiri mudah bahkan hanya dengan
long. Secara historis, ada banyak bagian aneh dalam garis waktu di mana 1 + 1 tidak sama dengan 2, dan ini banyak berasal dari sistem kalender seperti I Ching yang berubah tergantung posisi, seperti sudut matahari dan permukaan bumi. Dalam kasus seperti ini, kalender matahari-bulan Korea bahkan tidak pernah sekali pun dibahas.Dan itu ditentukan oleh Korea Astronomy and Space Science Institute.
Akhirnya! Menyenangkan!!
Akhirnya!!
ZonedDateTime...? Jangan-jangan kamu..!Akhirnya
time.hdi C ->java.util.Datedi Java ->Datedi JSjoda-time di Java -> JSR 310 ->
java.time-> moment.js ->
Temporaldi JSJadi memang alurnya seperti ini.
Komentar Hacker News
Berkat pemisahan antara instant dan datetime berbasis kalender, banyak kesalahan umum pada Date hampir bisa dihindari
Memang agak bertele-tele, tapi jauh lebih baik daripada dipanggil jam 3 pagi untuk memperbaiki bug DST
Isu yang dimulai pada 2012 akhirnya masuk ke pustaka standar sebagai solusi
Diskusi terkait bisa dilihat di thread Google Groups ini
Dulu saya memakai ciso8601, tetapi sejak masuk standar, semuanya jadi jauh lebih sederhana dan stabil
terutama karena ternyata ia mengimplementasikan semuanya sendirian sebagai relawan
Saya berbagi kode antara klien dan server, jadi saya berusaha memisahkan data dan logika secara ketat
Saya ingin semua data tetap berupa JSON murni agar serialisasi/deserialisasi mudah, tetapi objek Temporal kurang nyaman karena berupa instance kelas dengan properti fungsi
Saya rasa pendekatan seperti date-fns, yaitu menerapkan fungsi murni pada objek yang hanya berisi data, lebih baik
Pengembang harus merekonstruksi objek yang benar sendiri dari string ISO
Jika diotomatisasi, ada risiko menangani tipe yang salah
Contoh reviver Temporal.Instant di dokumentasi mungkin berguna
Tetapi saya rasa pilihan tim Temporal benar. Untuk logika tanggal dan waktu, keamanan tipe lebih penting daripada pendekatan data+fungsi sederhana
Dengan mengikat operasi ke objek, kita bisa mencegah PlainDate diperlakukan sebagai ZonedDateTime secara tidak sengaja
Di tempat seperti tRPC, cukup tambahkan lapisan tipis yang mengubah lewat Temporal.from() dan toString() di boundary
Memang sedikit merepotkan, tetapi tetap lebih baik daripada mengorbankan keamanan tipe
Date.toJSON memang ada, tetapi saat parsing JSON kita tetap harus mengubah string kembali menjadi Date
Temporal juga demikian, dan date-fns pada akhirnya juga menangani instance Date native
.toString()danTemporal.from()Sama seperti Date, yang benar adalah menanganinya secara eksplisit seperti ini
Selamat kepada semua champion yang telah bekerja keras selama ini
Saya menikmati mengerjakan temporal_rs dalam beberapa tahun terakhir
Karena proposal radikal JavaScript muncul pada 2018, saya penasaran apakah pendekatan Java ikut memberi pengaruh
TC39 memang merujuk preseden dari bahasa lain, tetapi mencapai konsensus ke arah yang dioptimalkan untuk JavaScript
Menurut saya API ini adalah implementasi paling matang yang dirancang oleh para ahli JS selama 9 tahun
Detail terkait juga bisa dilihat di thread HN ini
karena util.Date milik Java sendiri pada dasarnya hampir merupakan port dari API time.h milik C
Sekarang rasanya Safari menjadi penerus spiritual IE
Masalah IE bukan lambat, melainkan berhenti saat berada di posisi dominan
Sekarang Chrome-lah yang berada di singgasana imperium, dan justru Safari serta Firefox makin dibutuhkan
Meningkatnya situs yang hanya mendukung Chrome adalah masalah yang sebenarnya