JavaScript Temporal Akan Hadir
(developer.mozilla.org)- Objek Temporal baru di JavaScript mulai masuk ke rilis eksperimental browser, sebagai perubahan untuk menangani tanggal, waktu, durasi, dan kalender secara lebih akurat dan konsisten melalui API bawaan
Dateyang ada selama ini membuat penanganan zona waktu dan debugging menjadi sulit karena strukturnya berpusat pada waktu lokal pengguna dan UTC, parsing yang tidak stabil, serta perilaku mutable- Temporal memisahkan titik waktu, waktu lokal, dan durasi melalui
Temporal.Instant,Temporal.ZonedDateTime,Temporal.PlainDateTime,Temporal.Duration,Temporal.Now, dan lainnya, serta menyediakan lebih dari 200 metode utilitas - Masih dibutuhkan waktu hingga dukungan lintas-browser yang stabil tersedia; di Firefox Nightly, Temporal dapat dicoba di balik pengaturan
javascript.options.experimental.temporal - Minggu ini MDN menambahkan lebih dari 270 halaman dokumentasi Temporal, dan contoh dapat dijalankan tanpa mengubah flag di halaman dokumentasi TC39 yang menyertakan
@js-temporal/polyfill
Batasan Lama JavaScript Date
- Saat JavaScript dibuat pada 1995, objek
Datemenyalin implementasi awaljava.util.Datemilik Java; Java menggantinya pada 1997, tetapi JavaScript mempertahankan API yang sama selama hampir 30 tahun - Masalah terbesarnya adalah kurangnya dukungan zona waktu dan perilaku parsing yang tidak stabil
- Hanya mendukung waktu lokal pengguna dan UTC
Datesendiri bersifat mutable, sehingga dapat menimbulkan bug yang sulit dilacak- Perhitungan yang melintasi Daylight Saving Time (DST) dan perubahan kalender historis juga sulit ditangani
- Karena keterbatasan ini, banyak developer bergantung pada library khusus seperti Moment.js atau date-fns untuk menangani tanggal dan waktu dalam aplikasi
Model Tanggal dan Waktu yang Diubah oleh Temporal
- Temporal dirancang sebagai pengganti penuh untuk objek
Date, dengan tujuan membuat pengelolaan tanggal dan waktu lebih dapat diandalkan dan mudah diprediksi - Temporal mendukung representasi zona waktu dan kalender, serta menyediakan metode bawaan untuk konversi, perbandingan, perhitungan, dan formatting
- Permukaan API-nya mencakup lebih dari 200 metode utilitas, dan dokumentasi serta contoh telah ditambahkan ke dokumentasi Temporal di MDN
Tipe Utama Temporal
- Temporal membedakan titik waktu unik, waktu jam dinding lokal, dan durasi ke dalam tipe yang berbeda
- Struktur utamanya adalah sebagai berikut
Temporal.Duration: selisih antara dua titik waktuTemporal.Instant: titik waktu unik yang direpresentasikan sebagai timestampTemporal.ZonedDateTime: tanggal dan waktu yang menyertakan zona waktuTemporal.PlainDateTime: tanggal dan waktu lengkap tanpa zona waktuTemporal.PlainDate: hanya merepresentasikan tanggalTemporal.PlainYearMonth: tahun dan bulanTemporal.PlainMonthDay: bulan dan hariTemporal.PlainTime: hanya merepresentasikan waktu
Temporal.Now: API untuk mendapatkan waktu saat ini sebagai instance berbagai class atau dalam format tertentu
Cara Penggunaan Lewat Contoh
- Tanggal dan waktu saat ini dapat diperoleh sebagai string ISO, dan zona waktu dapat diteruskan ke berbagai metode
Temporal.Now.plainDateTimeISO()mengembalikan tanggal dan waktu saat ini di zona waktu sistemTemporal.Now.plainDateTimeISO("America/New_York")mengembalikan tanggal dan waktu saat ini di zona waktu New York
- Kalender selain Gregorian juga dapat ditangani, sehingga tanggal dalam sistem kalender seperti Hebrew, Chinese, dan Islamic dapat dibuat
- Menghitung Chinese New Year berikutnya menggunakan hari pertama
M01pada kalender Chinese - Pada output contoh saat penulisan, Chinese New Year berikutnya adalah
1/29/2025
- Menghitung Chinese New Year berikutnya menggunakan hari pertama
- Timestamp milidetik Unix Epoch dapat diubah menjadi titik waktu dengan
Temporal.Instant.fromEpochMilliseconds(), lalu dibandingkan denganTemporal.Now.instant()untuk menghitung waktu yang tersisa- Untuk timestamp contoh
1851222399924, waktu dari saat ini dihitung dengansmallestUnit: "hour" - Output
@js-temporal/polyfilladalah31,600 hr, sedangkan output Firefox Nightly adalahPT31600H
- Untuk timestamp contoh
toLocaleStringpada implementasi Firefox saat ini tidak menghasilkan string yang sensitif terhadap locale- Perilaku ini lebih dekat ke keputusan desain daripada keterbatasan teknis, dan formatting duration itu sendiri tetap memungkinkan
- Polyfill dan implementasi Firefox dapat berkonvergensi di kemudian hari
- Metode
compare()dapat digunakan untuk pengurutan array- Dengan
durations.sort(Temporal.Duration.compare), urutannya menjadiPT1H,PT1H30M,PT1H45M,PT2H
- Dengan
Dukungan Browser dan Cara Mencoba
- Dukungan Temporal mulai masuk secara perlahan ke rilis browser eksperimental, dan saat ini implementasi Firefox tampak paling matang
- Di Firefox, Temporal sedang dibangun di versi Nightly di balik pengaturan
javascript.options.experimental.temporal - Isu browser utama untuk pelacakan implementasi adalah sebagai berikut
- Firefox: Build temporal in Nightly by default
- Safari: [JSC] Implement Temporal
- Chrome: Implement the Temporal proposal
- Status kompatibilitas lengkap dapat dilihat di bagian Browser Compatibility untuk objek Temporal di MDN
- Dokumentasi TC39 Temporal menyertakan
@js-temporal/polyfill, sehingga contoh dapat dijalankan di konsol developer tools pada browser apa pun tanpa mengubah flag atau pengaturan
1 komentar
Opini Hacker News
Temporal itu bagus. Saya sudah cukup lama memakainya di produksi lewat polyfill, dan ini menyelesaikan banyak masalah yang dulu saya alami dengan API
Date()Rasanya seperti mengambil inspirasi dari library waktu yang bagus seperti
chronodi Rust dan Joda Time di Java, lalu menggabungkannya dengan baik menjadi API yang mudah dipakaiMemang sedikit lebih kompleks karena memisahkan waktu sederhana, titik waktu, dan waktu yang menyertakan zona waktu, tetapi waktu itu sendiri memang kompleks, jadi developer harus berhadapan dengan kompleksitas itu
Bahkan operasi seperti “menambahkan satu hari ke timestamp ini” pun harus diputuskan apakah berdasarkan zona waktu tertentu; kalau tidak, bug akan tetap muncul karena daylight saving time, perubahan zona waktu pengguna, atau perbedaan zona waktu server
Ini juga menyelesaikan perbedaan serialisasi antara timestamp dengan offset tetap (
2025-01-01T00:00+02:00) dan zona waktu tertentu (Europe/Paris)chrono: https://docs.rs/jiff/latest/jiff/_documentation/comparison/i...Secara pribadi, saya sulit melihat Temporal sangat terinspirasi dari
chronomilik Rust; pengaruh dari Joda,java.timemodern, serta library tanggal-waktu JavaScript seperti date-fns atau Moment.js tampaknya lebih besarMereka tidak mau mencari tahu apakah
Europe/Parisberarti wilayah luas di Prancis atau hanya Paris, dan merasa kesal karena seolah-olah mengatakan bahwa mereka tinggal di ParisSaat menjadwalkan acara komunitas online, hal seperti ini terasa menyakitkan. Orang ingin memakai offset tetap, dan ekspresi seperti
CET/CESTmasih dianggap oke, tetapi tidak suka sesuatu sepertiEurope/yourexactcoordinatesSebenarnya saya tahu sebagian besar zona waktu mencakup wilayah yang cukup luas, tetapi banyak orang peduli pada privasi sekaligus tidak terpikir untuk mencari tahu perbedaan antara “waktu” dan “zona waktu”
chronodan Joda Time berasal dari era yang berbeda. Saat Rust 1.0 keluar, Java sudah mengimplementasikan pendekatan ini di standard library lewat java.time, dan tidak membutuhkan library pihak ketiga untuk keperluan iniSaya butuh cukup lama untuk menemukannya di dokumentasi, tetapi Temporal.ZonedDateTime.prototype.withTimeZone() mengonversi dari satu zona waktu ke zona waktu lain: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
Nilai yang dibuat dengan
Temporal.ZonedDateTime.from("2021-08-01T12:00[America/New_York]"), jika dimasukkan kewithTimeZone("Europe/Paris"), menjadi2021-08-01T18:00:00+02:00[Europe/Paris]Konversi zona waktu dan penanganan durasi adalah fungsi inti yang wajib ditangani library, jadi bagus bahwa Temporal menangani keduanya. Namun di
Temporal.Durationtampaknya tidak ada fungsiformatkustom sepertiduration.format('H\hmm\m')untuk menghasilkan1h03m1 yr,3 hours,3m: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...Saya pernah mengimplementasikan sebagian di library icu4x
Saat ini ada cukup banyak proposal yang sedang matang di TC39, dan Temporal adalah salah satu yang ingin segera dirilis
Saya tahu bahwa agar browser utama mendukung fitur baru, diperlukan upaya pengembangan dari para engineer v8, JSC, dan SpiderMonkey, jadi saya benar-benar berterima kasih kepada orang-orang yang membuat kemajuan
Dari sudut pandang yang tidak sabar, rasanya ingin menyemangati dengan berkata, “Records dan Tuples juga cepat dong! Perang sintaks Pipe boleh dilewati saja!”
Sejauh yang saya pahami, vendor browser pada titik ini sudah cukup kuat menentang penambahan tipe primitif baru. Kesulitan tentang bagaimana kesetaraan seharusnya bekerja dijelaskan di thread ini: https://github.com/tc39/proposal-record-tuple/issues/387
Awalnya saya tidak menyangka BigInt akan dipakai sebanyak ini, tetapi dalam praktiknya kebutuhan akan koleksi dengan kesetaraan struktural terus muncul, jadi sayang sekali
Saya tahu penolakan terhadap penambahan tipe primitif baru juga memengaruhi pattern matching, tetapi saya tidak begitu tahu alasannya dan tidak terlalu mengikuti proposal tersebut
Pipeline, pattern matching, serta Records+Tuples semuanya sudah dikerjakan lebih dari 4 tahun dan masih tertahan di tahap 1–2. Selama setahun terakhir, hampir tidak terlihat kemajuan berarti kecuali mungkin pattern matching
Menurut isu di repositori Records dan Tuples, ada penolakan terhadap semantik nilai, yaitu apakah
===bisa berfungsi. Jika semantik nilai dihilangkan, kegunaan proposal itu akan sangat berkurangAgar semua ini mencapai tahap 3, setidaknya masih butuh 1–2 tahun lagi, atau mungkin tidak akan pernah sampai. Meski begitu, fungsi pengelompokan array sudah hadir
Sayangnya masih tahap 1, jadi sepertinya masih perlu beberapa tahun lagi
Dictionary di AS3 adalah tipe yang bisa memakai referensi objek, string, dan angka sebagai key unik, lalu menempelkan nilai bertipe apa pun. Garbage collection juga ditangani agar selama objek dictionary itu sendiri masih hidup, referensi tersebut bukan weak reference
Bayangkan Set di JavaScript, tetapi dalam bentuk yang memakai jenis key apa pun yang ditentukan secara strongly typed dan melempar error saat compile time. Saya rindu bahasa itu
Pembaruan-pembaruan itu pada dasarnya merusak ekosistem JavaScript, dan sekarang rasanya yang tersisa hanya bahasa yang dikompilasi ke JS. Orang yang masih memakai vanilla JS terasa seperti orang yang membuat aplikasi dengan assembly
Saya penasaran bagaimana data tiap zona waktu di dalam Temporal tetap diperbarui
Apakah strukturnya TC39 memperbarui data di suatu tempat, lalu tiap browser menyalin data itu ke dalam browser dan merilis versi baru? Dan jika pengguna belum memperbarui ke browser yang berisi data baru, apakah mereka akan melihat waktu yang salah di situs web saya?
Misalnya, Meksiko menghapus daylight saving time pada 2022: https://en.wikipedia.org/wiki/Time_in_Mexico
Library pihak ketiga seperti
pytzataumoment-timezonecukup diperbarui di sisi server, dan jika ditangani di standard library maka versi bahasanya bisa dinaikkan, tetapi saya tidak tahu bagaimana dengan Temporal dan browser pengunjungKomputer pengguna juga sepertinya bisa mengakses database ini dan menangani pembaruan, tetapi saya tidak yakin. Browser mungkin juga mengunduh dan memelihara database ini secara terpisah, dan tampaknya akan bergantung pada implementasi
Database terkait: https://en.wikipedia.org/wiki/Tz_database
Intl, jadi jika meneliti bagian itu kemungkinan bisa mendapatkan jawaban yang miriptzdbSecara umum tampaknya benar bahwa jika pengguna tidak memperbarui browser atau sistem agar mencerminkan data zona waktu baru, mereka bisa melihat waktu yang salah. Namun ini tidak jauh berbeda dari praktik umum saat ini
Alternatifnya adalah setiap aplikasi membawa
tzdbsendiri; sebagian aplikasi memang begitu dan ada kasus yang sah. Namun secara umum itu pemborosan, meningkatkan ketidaksesuaian antar-aplikasi, dan kemungkinan siklus pembaruannya juga lebih lambatPerlu menambahkan event untuk mendeteksi ketika seseorang mengubah zona waktu
Daftar “kebohongan yang dipercaya programmer tentang waktu” juga bisa memasukkan “programmer percaya zona waktu tetap selama penggunaan”. Kenyataannya, setiap hari jutaan orang berpindah zona waktu
Tentu saja, ini bisa membantu library
Sangat disayangkan
.Nowbukan pemanggilan fungsi. Seharusnya itu bukan propertiJika
.Nowdievaluasi beberapa kali di dalam loop, nilainya bisa berbeda setiap kali, dan ini tidak terdugaC# juga membuat pilihan yang sama, dan seharusnya tidak: https://ericlippert.com/2014/05/19/when-should-i-write-a-pro...
Nowadalah namespace untuk fungsi-fungsi yang mengambil nilai aktual, misalnya sepertiNow.instant()Saya sangat menyukai proposal Temporal, tetapi ada satu hal yang mengganjal. Perbandingannya bergantung pada kesetaraan referensi
Artinya
Temporal.Instant.from('2020-01-01') != Temporal.Instant.from('2020-01-01')Ini tidak buruk pada dasarnya, tetapi secara efektif menghilangkan kemampuan untuk memakai objek-objek ini sebagai key
Mapatau mengumpulkannya dalamSet. Saya mengerti mengapa keputusan itu dibuat, tetapi sayang sekali bahwa itu tidak mungkinMungkin suatu hari nanti, jika Records dan Tuples benar-benar hadir, akan ada versi yang berbasis pada itu
==?.epochMillisecondstampaknya bisa dipakai sebagai key atau elemenMap/Set. Namun, jika diMapperlu mempertahankan data zona waktu atau operasi tambahanInstant,Instantaslinya harus disimpan di sisi nilaiUntuk
Set, bisa memakai sesuatu sepertiMap{v.epochMilliseconds:v}untuk mempertahankanInstantTidak ideal, tetapi ini masalah yang harus disalahkan pada JavaScript itu sendiri, bukan Temporal. Runtime bisa saja dibuat menanganinya, tetapi kalau begitu polyfill akan gagal
Map/Setmirip dengan memakai angka floating-point diMap/Set, dan biasanya itu ide burukString()atau'2020-01-01'?Menyediakan fungsi pembanding yang bekerja bersama API yang sudah ada adalah desain yang solid. Bahkan bisa dijadikan syarat wajib baca saat menambahkan tipe baru
Misalnya, jika
Temporal.Duration.comparediteruskan kesort, urutannya bisa menjadiPT1H,PT1H30M,PT1H45M,PT2H. Salut untuk para perancangnyaSaya mengerti nama
Temporaldimaksudkan untuk menghindari benturan dengan objek waktu umum seperti Moment atau Datetime, tetapi namanya kurang bagusSaat pertama melihatnya, saya kira itu semacam kontrol garbage collection
temporalberarti terkait waktu sebagai lawan dari keabadian, terkait tense atau pembedaan waktu dalam tata bahasa, atau terkait waktu yang dibedakan dari ruang: https://www.merriam-webster.com/dictionary/temporalKedengarannya seperti nama yang cukup bagus
Pertama,
Temporalitu adjektiva, bukan nomina. Memang terkait waktu, tetapi tidak terasa intuitifYang lebih penting, jika memilih nama aneh demi menurunkan kemungkinan bentrok dengan kode lama, seiring waktu bahasa akan menjadi makin buram
Saat
PromisedanGeneratorditambahkan, ada banyak library yang memakai nama objek itu. Berbeda dengan reserved word, objek bawaan bisa ditimpa, jadi itu bukan masalah besarMenurut saya komite standar seharusnya teguh memakai
Timedemi kesehatan jangka panjang bahasaTentu saja perdebatan ini sudah berlalu, dan para pembuat browser serta implementor engine JS pasti sudah sepakat
DateV2malah lebih baikSaya mengerti perlu kompatibilitas mundur, tetapi
Temporalterdengar kurang enak.DateTimejuga bukan nama yang ada di standar JS, jadi saya tidak tahu mengapa mereka tidak memakai itu. Sampai saat itu, sepertinya saya akan memakaiconst DateTime = TemporalTulisan terkait:
JavaScript Temporal Is Coming - https://news.ycombinator.com/item?id=42809834 - Januari 2025, 18 komentar
Mozilla: Temporal (Limited Availability) - https://news.ycombinator.com/item?id=42776548 - Januari 2025, 1 komentar
Is It Time for the JavaScript Temporal API? - https://news.ycombinator.com/item?id=29712118 - Desember 2021, 100 komentar
Temporal: Getting started with JavaScript's new date time API - https://news.ycombinator.com/item?id=27661667 - Juni 2021, 194 komentar
JavaScript Temporal - https://news.ycombinator.com/item?id=27395236 - Juni 2021, 1 komentar
JavaScript Proposal Temporal for Dates is now stage 3 - https://news.ycombinator.com/item?id=26432346 - Maret 2021, 1 komentar
Ungkapan bahwa kapal besar lambat berbelok memang tepat