Latar Belakang
Date
Objek JavaScript melacak waktu dalam UTC secara internal, tetapi biasanya menerima input dan menghasilkan output pada waktu lokal komputer itu berjalan. Ini memiliki sedikit fasilitas untuk bekerja dengan waktu di zona waktu lainnya.
Representasi internal suatu Date
objek adalah angka tunggal, yang mewakili jumlah milidetik yang telah berlalu sejak itu 1970-01-01 00:00:00 UTC
, tanpa memperhatikan detik kabisat. Tidak ada zona waktu atau format string yang disimpan di objek Date itu sendiri. Ketika berbagai fungsi Date
objek digunakan, zona waktu lokal komputer diterapkan ke representasi internal. Jika fungsi menghasilkan string, maka informasi lokal komputer dapat dipertimbangkan untuk menentukan cara menghasilkan string itu. Detailnya bervariasi per fungsi, dan beberapa spesifik implementasi.
Satu-satunya operasi yang Date
dapat dilakukan objek dengan zona waktu non-lokal adalah:
Itu dapat mengurai string yang berisi offset UTC numerik dari zona waktu mana pun. Ini menggunakan ini untuk menyesuaikan nilai yang diuraikan, dan menyimpan setara UTC. Waktu lokal asli dan offset tidak dipertahankan dalam Date
objek yang dihasilkan . Sebagai contoh:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
Di lingkungan yang telah menerapkan API Internasionalisasi ECMASCript (alias "Intl"), Date
objek dapat menghasilkan string spesifik lokal yang disesuaikan dengan pengidentifikasi zona waktu tertentu. Ini dilakukan melalui timeZone
opsi ke toLocaleString
dan variasinya. Sebagian besar implementasi akan mendukung pengidentifikasi zona waktu IANA, seperti 'America/New_York'
. Sebagai contoh:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
Sebagian besar lingkungan modern mendukung set lengkap pengidentifikasi zona waktu IANA ( lihat tabel kompatibilitas di sini ). Namun, perlu diingat bahwa satu-satunya pengidentifikasi yang diperlukan untuk didukung oleh Intl adalah 'UTC'
, oleh karena itu Anda harus memeriksa dengan seksama jika Anda perlu mendukung browser lama atau lingkungan atipikal (misalnya, perangkat IoT ringan).
Perpustakaan
Ada beberapa perpustakaan yang dapat digunakan untuk bekerja dengan zona waktu. Meskipun mereka masih tidak dapat membuat Date
objek berperilaku berbeda, mereka biasanya mengimplementasikan basis data zona waktu IANA standar dan menyediakan fungsi untuk menggunakannya dalam JavaScript. Perpustakaan modern menggunakan data zona waktu yang disediakan oleh API Intl, tetapi perpustakaan yang lebih tua biasanya memiliki overhead, terutama jika Anda berjalan di browser web, karena basis datanya bisa menjadi agak besar. Beberapa perpustakaan ini juga memungkinkan Anda untuk mengurangi set data secara selektif, baik dengan zona waktu mana yang didukung dan / atau rentang tanggal yang dapat Anda gunakan.
Berikut adalah perpustakaan yang perlu dipertimbangkan:
Perpustakaan berbasis internasional
Pengembangan baru harus memilih dari salah satu implementasi ini, yang mengandalkan API Intl untuk data zona waktu mereka:
Perpustakaan Non-Internasional
Perpustakaan-perpustakaan ini dikelola, tetapi membawa beban mengemas data zona waktu mereka sendiri, yang bisa sangat besar.
* Sementara Moment dan Moment-Timezone sebelumnya direkomendasikan, tim Moment sekarang lebih suka pengguna memilih Luxon untuk pengembangan baru.
Perpustakaan Dihentikan
Perpustakaan-perpustakaan ini telah secara resmi dihentikan dan seharusnya tidak lagi digunakan.
Proposal Masa Depan
The TC39 Temporal Proposal bertujuan untuk menyediakan satu set baru objek standar untuk bekerja dengan tanggal dan waktu dalam bahasa JavaScript itu sendiri. Ini akan mencakup dukungan untuk objek yang sadar zona waktu.