16 poin oleh GN⁺ 2024-08-25 | 5 komentar | Bagikan ke WhatsApp
  • 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 compare untuk 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 hoursInDay mengembalikan 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 withTimeZone dapat 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 .add memungkinkan 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 .until menghitung selisih antara dua waktu dan mengembalikannya sebagai objek Temporal.Duration
    • Misalnya, dapat digunakan seperti zdt.until(other)

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 Date yang ada dan isu migrasi tetap perlu dipertimbangkan
  • API Temporal dirancang 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

 
kyc1682 2024-08-26

Akhirnya!

 
huiya 2024-08-26

Gila, waktu merancang layanan global, urusan tanggal memang selalu bikin pusing
Ini jadi bikin ingin coba sekali

 
jjpark78 2024-08-26

Serius, akhirnya kita bisa tanpa moment atau dayjs, ya?

 
GN⁺ 2024-08-25
Komentar Hacker News
  • Menangani tanggal dan waktu di Javascript sangat sulit

    • Library Moment mencampuradukkan tanggal dan waktu sehingga menimbulkan banyak masalah
    • Library Arrow di Python juga melakukan kesalahan yang sama
    • Library Chrono di Rust lebih mudah diprediksi dan memiliki lebih sedikit cacat
    • Date dan Moment di JS sulit digunakan
  • API baru diharapkan dapat menyelesaikan masalah zona waktu di JS

    • Ada masalah di mana zona waktu tertentu berhasil di-parse, tetapi dalam kasus lain diasumsikan sebagai UTC
    • Di tempat kerja sebelumnya, saya mengalami kesulitan besar karena masalah ini
  • Fungsi yang mengubah timestamp menjadi tanggal yang bisa dibaca manusia tidak bersifat injective

    • Ada kebingungan antara konsep injectivity dan well-definedness
    • Untuk timestamp t, tidak ada satu tanggal yang bisa dibaca manusia x yang unik
  • Lelucon tentang kurva tingkat kesulitan dalam menangani waktu

    • Pemula hanya menggunakan timestamp UTC
    • Pengguna menengah bersikeras bahwa zona waktu harus disimpan dan dikonversi
    • Ahli pada akhirnya kembali hanya menggunakan timestamp UTC
  • Jika lebih banyak contoh tanggal di masa depan digunakan, artikelnya akan lebih meyakinkan

    • Saat mencatat timestamp, yang dibutuhkan hanya UTC dan lokasi
    • Contoh perbankan hanyalah masalah UX, bukan kehilangan informasi
  • Pengguna merasa cemas karena tidak memahami penanganan waktu

    • Meminta rekomendasi pengantar yang baik untuk memahami masalah penanganan waktu di bahasa seperti Python
  • Memiliki standar datetime yang baik adalah setengah dari perjuangan

    • Setengah sisanya adalah adopsi yang luas
    • Demi kompatibilitas dengan sistem lain, mengonversinya ke string ISO atau unix timestamp adalah pilihan aman
  • String tanggal ISO harus menangkap informasi yang akurat

    • Ada keraguan terhadap gagasan bahwa JavaScript atau bahasa lain memerlukan struktur bawaan
    • Temporal dan Date menyelesaikan masalah sederhana dengan cara yang rumit
  • Bertanya bagaimana menangani masalah ini di Postgres

  • Kurang bukti bahwa Temporal benar-benar akan diadopsi

    • Seperti banyak proposal JS menjanjikan lainnya, ini hanya dibahas selama waktu yang lama