Saya memiliki waktu tanggal dalam zona waktu tertentu sebagai string dan saya ingin mengonversikan ini ke waktu lokal. Tapi, saya tidak tahu cara mengatur zona waktu di objek Date.
Misalnya, saya punya Feb 28 2013 7:00 PM ET,
maka saya bisa
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
Sejauh yang saya tahu, saya dapat mengatur waktu UTC atau waktu lokal. Tapi, bagaimana cara mengatur waktu di zona waktu lain?
Saya mencoba menggunakan add / kurangi offset dari UTC tetapi saya tidak tahu bagaimana cara melawan penghematan siang hari. Saya tidak yakin apakah saya menuju ke arah yang benar.
Bagaimana saya bisa mengubah waktu dari zona waktu berbeda ke waktu lokal dalam javascript?
javascript
timezone
beraspal
sumber
sumber
Jawaban:
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 itu1970-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 fungsiDate
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: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 melaluitimeZone
opsi ketoLocaleString
dan variasinya. Sebagian besar implementasi akan mendukung pengidentifikasi zona waktu IANA, seperti'America/New_York'
. Sebagai contoh: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.
sumber
var date_time = new Date()
nilaidate_time
is (untuk saya di AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
dan karena itu sepertinya ia telah menyimpan zona waktu. Bagaimana saya memastikan bahwadate_time
ini murni waktu UTC, tanpa ada zona waktu?new Date().getTime();
Seperti yang dikatakan Matt Johnson
Jadi, meskipun peramban tidak dapat membaca zona waktu IANA saat membuat tanggal, atau memiliki metode apa pun untuk mengubah zona waktu pada objek Tanggal yang ada, tampaknya ada peretasan di sekitarnya:
sumber
toLocaleString
untuk mencapai efek sebaliknya, dan ya, ini harus menjadi pengetahuan umum! pergi menulis artikel tentang hal itu dan menyebutkan saya :-)Date
objek yang dikembalikan adalah dusta. Bahkan contoh yang ditunjukkan, output string termasuk zona waktu mesin lokal. Di komputer saya, kedua hasil mengatakan "GMT-0700 (Waktu Siang Pasifik)", di mana itu hanya benar untuk yang pertama (Toronto sebenarnya di Waktu Timur.) Di luar hanya output string, cap waktu yang disimpan dalamDate
objek telah bergeser ke titik waktu yang berbeda. Ini bisa menjadi teknik yang berguna, tetapi dilengkapi dengan banyak peringatan - terutama bahwaDate
fungsi objek tidak akan memiliki output normal.Anda dapat menentukan offset zona waktu aktif
new Date()
, misalnya:atau
Sejak
Date
menyimpan waktu UTC (yaitugetTime
mengembalikan dalam UTC), javascript akan mereka mengubah waktu menjadi UTC, dan ketika Anda memanggil hal-hal sepertitoString
javascript akan mengubah waktu UTC menjadi zona waktu lokal browser dan mengembalikan string dalam zona waktu lokal, yaitu Jika saya menggunakanUTC+8
:Anda juga dapat menggunakan
getHours/Minute/Second
metode normal :(Ini
8
berarti setelah waktu dikonversi ke waktu lokal saya -UTC+8
, nomor jamnya adalah8
.)sumber
Ini harus menyelesaikan masalah Anda, jangan ragu untuk menawarkan perbaikan. Metode ini juga akan memperhitungkan waktu musim panas untuk tanggal yang ditentukan.
Cara menggunakan dengan zona waktu dan waktu lokal:
sumber
tzDate
langsung saja kembali ?Saya menemukan cara yang paling didukung untuk melakukan ini, tanpa khawatir tentang perpustakaan pihak ketiga, adalah dengan menggunakan
getTimezoneOffset
untuk menghitung cap waktu yang sesuai, atau memperbarui waktu kemudian menggunakan metode normal untuk mendapatkan tanggal dan waktu yang diperlukan.EDIT
Saya sebelumnya menggunakan
UTC
metode ketika melakukan transformasi tanggal, yang tidak benar. Dengan menambahkan offset ke waktu, menggunakanget
fungsi lokal akan mengembalikan hasil yang diinginkan.sumber
timezone_offset
?timezone_offset
seharusnyaoffset
, atau sebaliknya visa. Saya telah mengedit jawaban saya untuk menunjukkan nama variabel yang benar.Saya mengalami masalah yang sama dengan tes unit (khususnya bercanda ketika tes unit berjalan secara lokal untuk membuat snapshot dan kemudian server CI berjalan di (berpotensi) zona waktu yang berbeda menyebabkan perbandingan snapshot gagal). Saya mengejek kami
Date
dan beberapa metode pendukung seperti:sumber
Coba gunakan ctoc dari npm. https://www.npmjs.com/package/ctoc_timezone
Ini memiliki fungsi sederhana untuk mengubah zona waktu (sebagian besar zona waktu sekitar 400) dan semua format khusus yang Anda inginkan ditampilkan.
sumber
Berdasarkan jawaban di atas, saya menggunakan liner asli ini untuk mengubah string zona waktu lama menjadi string tiga huruf:
Ini akan memberikan PDT atau PST tergantung pada tanggal yang disediakan. Dalam kasus penggunaan khusus saya, berkembang di Salesforce (Aura / Lightning), kami bisa mendapatkan zona waktu pengguna dalam format panjang dari backend.
sumber
Saya tahu ini terlambat 3 tahun, tetapi mungkin bisa membantu orang lain karena saya belum menemukan yang seperti itu kecuali perpustakaan time-timezone, yang tidak persis sama dengan apa yang dia minta di sini.
Saya telah melakukan sesuatu yang mirip dengan zona waktu Jerman, ini sedikit rumit karena waktu musim panas dan tahun kabisat di mana Anda memiliki 366 hari.
mungkin perlu sedikit kerja dengan fungsi "isDaylightSavingTimeInGermany" sementara zona waktu yang berbeda berubah pada waktu yang berbeda dengan waktu musim panas.
bagaimanapun, lihat halaman ini: https://github.com/zerkotin/german-timezone-converter/wiki
metode utamanya adalah: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone
Saya sudah berusaha mendokumentasikannya, jadi tidak akan membingungkan.
sumber
Coba: date-from-timezone , ia menyelesaikan tanggal yang diharapkan dengan bantuan yang tersedia secara asli
Intl.DateTimeFormat
.Saya menggunakan metode itu di salah satu proyek saya selama beberapa tahun, tetapi sekarang saya memutuskan untuk mempublikasikannya sebagai proyek OS kecil :)
sumber
Mungkin ini akan membantu Anda
sumber
Untuk pengguna ionik, saya tidak suka dengan ini karena
.toISOString()
harus digunakan dengan template html.Ini akan mengambil tanggal saat ini, tetapi tentu saja dapat ditambahkan ke jawaban sebelumnya untuk tanggal yang dipilih.
Saya memperbaikinya menggunakan ini:
* 60000 menunjukkan UTC -6 yang merupakan CST sehingga TimeZone apa pun yang diperlukan, angka dan perbedaan dapat diubah.
sumber
Sedang menghadapi masalah yang sama, gunakan yang ini
Console.log (Date.parse ("13 Jun 2018 10:50:39 GMT + 1"));
Ini akan mengembalikan milidetik ke mana Anda dapat memeriksa apakah +100 timzone menginternalisasi waktu Inggris Semoga bermanfaat !!
sumber