JavaScript Dates akhirnya akan diperbaiki
(docs.timetime.in)- Salah satu perubahan terbaru yang paling menonjol di ECMAScript adalah proposal Temporal
- API ini sudah bisa digunakan sekarang melalui polyfill yang disediakan oleh tim FullCalendar
- Salah satu keunggulan utama API ini adalah akhirnya ada objek native untuk merepresentasikan "Zoned Date Time"
Apa itu Zoned Date Time?
- Saat menangani tanggal yang dipahami manusia, kita biasanya menyebut tanggal dan waktu tanpa menyertakan zona waktu
- Namun, objek "Date" di JavaScript hanya menangani angka, sehingga makna asli dari tanggal tersebut hilang
- Misalnya, saat ingin mencatat waktu pembayaran kartu, banyak orang mungkin akan menggunakan kode seperti berikut
const paymentDate = new Date('2024-07-20T10:30:00'); - Ini membuat browser menghitung milidetik berdasarkan zona waktu pengguna (CET). Namun, informasi yang tersimpan bisa ditafsirkan berbeda tergantung zona waktu
- Di JavaScript, selain fakta yang sangat penting bahwa tanggal menggunakan POSIX, bukan UTC, sehingga leap second sepenuhnya diabaikan, ada juga masalah bahwa ketika hanya angka yang tersisa, makna asli tanggal tersebut hilang
- Banyak orang mengira aman jika bekerja dengan UTC atau mengirim tanggal dalam format ISO, tetapi itu tetap tidak benar karena informasi masih bisa hilang
UTC tidak cukup
- Bahkan jika bekerja dengan format ISO, saat menampilkan tanggal kita tetap kekurangan informasi zona waktu
- Fungsi yang mengubah timestamp menjadi tanggal yang dapat dibaca manusia bukanlah injective (fungsi injektif)
- Sebagai contoh, ketika bepergian dari Madrid ke Sydney lalu kembali, masalah zona waktu pada riwayat transaksi bank bisa menimbulkan kebingungan
Memperkenalkan Temporal API
- Temporal API memperkenalkan objek Temporal.ZonedDateTime untuk merepresentasikan tanggal dan waktu bersama zona waktunya
- API ini mengusulkan ekstensi terhadap RFC 3339 untuk memberikan standar serialisasi dan deserialisasi tanggal dalam bentuk string
1996-12-19T16:39:57-08:00[America/Los_Angeles]- String ini merepresentasikan 19 Desember 1996 pukul 16:39:57,
- offset-nya adalah -08:00 dari UTC (Pacific Standard Time/PST tempat Los Angeles berada)
- dan juga secara eksplisit menyebut zona waktu yang relevan ("Pacific Standard Time") agar dapat dipertimbangkan oleh aplikasi yang memahami zona waktu
- Mendukung berbagai sistem kalender (misalnya: Buddha, Tiongkok, Dangi, Gregorian, Islam, Persia, Jepang, dan lainnya)
Operasi dasar
Membuat tanggal
- Temporal API menyediakan alat yang kuat untuk menangani zona waktu
- Misalnya, saat membuat objek
Temporal.ZonedDateTime, zona waktunya dicerminkan secara akurat:const zonedDateTime = Temporal.ZonedDateTime.from({ year: 2024, month: 8, day: 16, hour: 12, minute: 30, second: 0, timeZone: 'Europe/Madrid'}); - Karena itu, waktu tetap akurat meskipun ada perubahan zona waktu atau penyesuaian waktu lokal seperti DST
Membandingkan tanggal
- Objek ZonedDateTime menyediakan metode
compareuntuk membandingkan dua ZonedDateTime: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
Fitur bawaan yang berguna
- Properti
hoursInDaymengembalikan jumlah jam sebenarnya pada hari tersebut:Temporal.ZonedDateTime.from('2020-03-08T12:00-07:00[America/Los_Angeles]').hoursInDay; // => 23 (hari dimulainya DST)
Konversi zona waktu
- Metode
withTimeZonedapat digunakan untuk mengubah zona waktu pada ZonedDateTime: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]'
Operasi aritmetika dasar
- Metode
.addmemungkinkan penambahan atau pengurangan tanggal sesuai aturan DST: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]
Menghitung selisih antar tanggal
- Metode
.untilmenghitung selisih antara dua waktu dan mengembalikannya sebagai objekTemporal.Duration- Misalnya, dapat digunakan seperti
zdt.until(other)
- Misalnya, dapat digunakan seperti
Kesimpulan
- Temporal API akan mengubah secara mendasar cara JavaScript menangani waktu
- Artikel ini membahas perbedaan antara tanggal yang dapat dibaca manusia dan tanggal UTC, serta cara merepresentasikannya secara akurat dengan objek Temporal.ZonedDateTime
- Artikel berikutnya akan mengeksplorasi objek menarik lainnya seperti Instant, PlainDate, dan Duration
Opini GN⁺
- Masalah penanganan tanggal dan waktu yang sudah lama menyulitkan developer JavaScript kemungkinan akan teratasi dengan Temporal API
- Karena dapat menangani masalah zona waktu dan DST secara otomatis, ini akan sangat berguna saat membangun aplikasi global
- Kompatibilitas dengan objek
Dateyang ada dan isu migrasi tetap perlu dipertimbangkan - API
Temporaldirancang dengan cara yang jelas dan intuitif, serta unggul dari sisi dukungan internasionalisasi karena mendukung berbagai sistem kalender - Perubahan ini diharapkan akan sangat meningkatkan produktivitas developer JavaScript
5 komentar
Akhirnya!
Sebagai referensi, Deno sudah menyertakan Temporal API secara bawaan.
Gila, waktu merancang layanan global, urusan tanggal memang selalu bikin pusing
Ini jadi bikin ingin coba sekali
Serius, akhirnya kita bisa tanpa moment atau dayjs, ya?
Komentar Hacker News
Menangani tanggal dan waktu di Javascript sangat sulit
Datedan Moment di JS sulit digunakanAPI baru diharapkan dapat menyelesaikan masalah zona waktu di JS
Fungsi yang mengubah timestamp menjadi tanggal yang bisa dibaca manusia tidak bersifat injective
Lelucon tentang kurva tingkat kesulitan dalam menangani waktu
Jika lebih banyak contoh tanggal di masa depan digunakan, artikelnya akan lebih meyakinkan
Pengguna merasa cemas karena tidak memahami penanganan waktu
Memiliki standar datetime yang baik adalah setengah dari perjuangan
String tanggal ISO harus menangkap informasi yang akurat
Datemenyelesaikan masalah sederhana dengan cara yang rumitBertanya bagaimana menangani masalah ini di Postgres
Kurang bukti bahwa Temporal benar-benar akan diadopsi