Bagaimana saya bisa mengumpulkan informasi zona waktu pengunjung? Saya membutuhkan Zona Waktu, serta jam offset GMT.
javascript
timezone
Árvíztűrő tükörfúrógép
sumber
sumber
Jawaban:
Perhatikan bahwa tidak semua zona waktu diimbangi dengan seluruh jam: misalnya, Newfoundland adalah UTC minus 3j 30 m (meninggalkan Daylight Saving Time dari persamaan).
sumber
getTimezoneOffset
ketidakakuratan berlaku? Artikel yang Anda maksud adalah tanggal Juni 2007 dan tidak memiliki rincian tentang bagaimana fungsi tersebut tidak akurat. Dan sebenarnya perpustakaan yangjsTimezoneDetect
Anda tunjuk menggunakangetTimezoneOffset
dirinya sendiri.var hrs = -(new Date().getTimezoneOffset() / 60)
untuk mendapatkan offset dalam jam yang biasanya digunakantimezone
! =utc offset
Menggunakan offset untuk menghitung Zona Waktu adalah pendekatan yang salah, dan Anda akan selalu menemui masalah. Zona waktu dan aturan penghematan siang hari dapat berubah pada beberapa kesempatan selama setahun, dan Sulit untuk mengikuti perubahan.
Untuk mendapatkan zona waktu IANA sistem dalam JavaScript, Anda harus menggunakan
Pada September 2019, ini berfungsi di 95% dari browser yang digunakan secara global .
Informasi kompatibilitas lama
ecma-402 / 1.0 mengatakan bahwa
timeZone
mungkin tidak terdefinisi jika tidak disediakan untuk konstruktor. Namun, konsep di masa depan (3.0) memperbaiki masalah itu dengan mengubah ke zona waktu default sistem.di ecma-402 / 3.0 yang masih dalam konsep itu diubah menjadi
sumber
Saya menyadari bahwa jawaban ini sedikit keluar dari topik, tetapi saya membayangkan banyak dari kita yang mencari jawaban juga ingin memformat zona waktu untuk tampilan dan mungkin mendapatkan singkatan zona juga. Jadi begini ...
Jika Anda ingin zona waktu klien diformat dengan baik, Anda dapat mengandalkan metode JavaScript Date.toString dan lakukan:
Ini akan memberi Anda "GMT-0400 (EST)" misalnya, termasuk menit zona waktu jika berlaku.
Atau, dengan regex Anda dapat mengekstrak bagian yang diinginkan:
Untuk "GMT-0400 (EDT)":
Untuk "GMT-0400":
Hanya untuk "EDT":
Hanya untuk "-0400":
Referensi Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
sumber
split[4] + " " + split[5]
?!split
berisi:["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
jadi hasilnyaDaylight Time)
new Date().toString()
sepenuhnya tergantung pada pengaturan lokal Anda. Mengharapkan output klien lain menyerupai milik Anda adalah ide yang sangat buruk.Sudah dijawab bagaimana cara mendapatkan offset dalam hitungan menit sebagai integer, tetapi jika ada yang menginginkan offset GMT lokal sebagai string misalnya
"+1130"
:sumber
pad(parseInt(Math.abs(offset/60)), 2)
untuk memperbaikinya ... kalau tidak Anda mungkin mendapatkan +5.530 seperti dalam kasus saya ... saya tidak yakin apakah lantai matematika dll akan menjadi hal yang lebih baik di sini atau tidak .... tapi ini atleast memberi saya +530 seperti yang diharapkanKamu bisa menggunakan:
zona waktu saat
Deteksi zona waktu browser agak sulit untuk dilakukan dengan benar, karena ada sedikit informasi yang disediakan oleh browser.
Moment Timezone menggunakan
Date.getTimezoneOffset()
danDate.toString()
pada beberapa momen di sekitar tahun berjalan untuk mengumpulkan sebanyak mungkin informasi tentang lingkungan browser. Kemudian membandingkan informasi itu dengan semua data zona waktu yang dimuat dan mengembalikan kecocokan terdekat. Dalam hal ikatan, zona waktu dengan kota dengan populasi terbesar dikembalikan.sumber
Saya menulis fungsi dalam proyek saya, yang mengembalikan zona waktu dalam
hh:mm
format. Saya harap ini dapat membantu seseorang:Tampilkan cuplikan kode
Biola yang Bekerja
sumber
Satu-liner yang memberikan offset dan zona waktu adalah dengan memanggil toTimeString () pada objek Date yang baru. Dari MDN:
Tangkapannya adalah bahwa zona waktu tidak dalam format IANA standar; itu agak lebih ramah pengguna, daripada format IANA "benua / kota" . Cobalah:
Di California sekarang,
toTimeString()
kembaliPacific Daylight Time
sementara API Intl kembaliAmerica/Los_Angeles
. Di Kolombia, Anda akan mendapatkanColombia Standard Time
, vsAmerica/Bogota
.Perhatikan bahwa banyak jawaban lain untuk pertanyaan ini mencoba memperoleh informasi yang sama dengan memanggil Date.toString (). Pendekatan itu tidak dapat diandalkan, seperti yang dijelaskan MDN :
sumber
mencoba
getTimezoneOffset()
dariDate
objek:Metode ini mengembalikan offset zona waktu dalam menit yang merupakan perbedaan antara GMT dan waktu lokal dalam menit.
sumber
JavaScript:
sumber
Dengan moment.js :
sumber
z
danzz
telah ditinggalkan pada 1.6.0 lihat momentjs.com/docs/#/displaying/formatZ
danZZ
.zoneAbbr()
telah digantiz
danzz
. Lihat dokumentasi di siniDengan momentjs, Anda dapat menemukan zona waktu saat ini sebagai
Dengan dayjs, Anda dapat menemukan zona waktu saat ini sebagai
Kedua API mengembalikan utc offset dalam hitungan menit.
sumber
getTimezoneOffset()
.Zona waktu dalam jam-
Jika Anda ingin tepat seperti yang Anda sebutkan dalam komentar, maka Anda harus mencoba seperti ini-
sumber
Jika yang Anda butuhkan adalah singkatan zona waktu "MST" atau "EST":
sumber
Date.toString()
tidak dapat diandalkan, dan MDN menjelaskan alasannya. Saya telah menempel bagian yang relevan dari dokumen mereka dalam jawaban saya .Lihat operator yang dihasilkan ini berseberangan dengan Zona Waktu. Jadi, terapkan beberapa fungsi matematika lalu validasikan num lebih sedikit atau lebih.
Lihat dokumen MDN
sumber
round
? Seharusnya begitufloor
, bukan?Contoh: Kamis 21 Juni 2018 18:12:50 GMT + 0530 (Waktu Standar India)
O / P: +0530
sumber
Date.toString()
tidak dapat diandalkan, dan MDN menjelaskan alasannya. Saya telah menempel bagian yang relevan dari dokumen mereka dalam jawaban saya .Coba ini,
sumber
Nilai ini dari mesin pengguna dan dapat diubah kapan saja jadi saya pikir itu tidak masalah, saya hanya ingin mendapatkan nilai perkiraan dan kemudian mengubahnya ke GMT di server saya.
Misalnya, saya dari Taiwan dan mengembalikan "+8" untuk saya.
Contoh kerja
JS
HTML
Hasil
sumber
Pada
new Date(
) Anda bisa mendapatkan offset, untuk mendapatkan nama zona waktu yang dapat Anda lakukan:new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
Anda mendapatkan nilai
()
di antara di akhir tanggal, itu adalah nama zona waktu.sumber
Date.toString()
tidak dapat diandalkan, dan MDN menjelaskan alasannya. Saya telah menempel bagian yang relevan dari dokumen mereka dalam jawaban saya . Juga, jawaban ini sudah diberikan setidaknya 3 kali.Ini akan menjadi solusi saya: