Bagaimana saya bisa mengumpulkan informasi zona waktu pengunjung? Saya membutuhkan Zona Waktu, serta jam offset GMT.
Bagaimana saya bisa mengumpulkan informasi zona waktu pengunjung? Saya membutuhkan Zona Waktu, serta jam offset GMT.
Jawaban:
var offset = new Date().getTimezoneOffset();
console.log(offset);
Offset zona waktu adalah perbedaan, dalam menit, antara UTC dan waktu lokal. Perhatikan bahwa ini berarti bahwa offset positif jika zona waktu lokal di belakang UTC dan negatif jika berada di depan. Misalnya, jika zona waktu Anda UTC + 10 (Waktu Standar Australia Timur), -600 akan dikembalikan. Penghematan waktu siang hari mencegah nilai ini menjadi konstan bahkan untuk lokasi tertentu
Perhatikan bahwa tidak semua zona waktu diimbangi dengan seluruh jam: misalnya, Newfoundland adalah UTC minus 3j 30 m (meninggalkan Daylight Saving Time dari persamaan).
getTimezoneOffset
ketidakakuratan berlaku? Artikel yang Anda maksud adalah tanggal Juni 2007 dan tidak memiliki rincian tentang bagaimana fungsi tersebut tidak akurat. Dan sebenarnya perpustakaan yang jsTimezoneDetect
Anda tunjuk menggunakan getTimezoneOffset
dirinya sendiri.
var hrs = -(new Date().getTimezoneOffset() / 60)
untuk mendapatkan offset dalam jam yang biasanya digunakan
timezone
! =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
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
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.
Dalam versi Internasionalisasi API ECMAScript ini,
timeZone
properti akan tetap tidak terdefinisi jika tidak adatimeZone
properti yang disediakan dalam objek opsi yang disediakan untukIntl.DateTimeFormat
konstruktor . Namun, aplikasi tidak boleh bergantung pada ini, karena versi masa depan dapat mengembalikan nilai String yang mengidentifikasi zona waktu lingkungan host saat ini sebagai gantinya.
di ecma-402 / 3.0 yang masih dalam konsep itu diubah menjadi
Dalam versi Internasionalisasi API ECMAScript 2015 ini,
timeZone
properti akan menjadi nama zona waktu default jika tidak adatimeZone
properti yang disediakan dalam objek opsi yang disediakan untukIntl.DateTimeFormat
konstruktor. Versi sebelumnya membuattimeZone
properti tidak terdefinisi dalam kasus ini.
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:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
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)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Untuk "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Hanya untuk "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Hanya untuk "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Referensi Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
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"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
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 diharapkan
Kamu bisa menggunakan:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Deteksi zona waktu browser agak sulit untuk dilakukan dengan benar, karena ada sedikit informasi yang disediakan oleh browser.
Moment Timezone menggunakan Date.getTimezoneOffset()
dan Date.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.
console.log(moment.tz.guess()); // America/Chicago
Saya menulis fungsi dalam proyek saya, yang mengembalikan zona waktu dalam hh:mm
format. Saya harap ini dapat membantu seseorang:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Satu-liner yang memberikan offset dan zona waktu adalah dengan memanggil toTimeString () pada objek Date yang baru. Dari MDN:
The
toTimeString()
Metode mengembalikan porsi waktu dari objek Tanggal dalam bentuk yang dapat dibaca manusia dalam bahasa Inggris Amerika.
Tangkapannya adalah bahwa zona waktu tidak dalam format IANA standar; itu agak lebih ramah pengguna, daripada format IANA "benua / kota" . Cobalah:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
Di California sekarang, toTimeString()
kembali Pacific Daylight Time
sementara API Intl kembali America/Los_Angeles
. Di Kolombia, Anda akan mendapatkan Colombia Standard Time
, vs America/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 :
Contoh tanggal merujuk ke titik waktu tertentu. Memanggil toString () akan mengembalikan tanggal yang diformat dalam bentuk yang dapat dibaca manusia dalam bahasa Inggris Amerika. [...] Terkadang diinginkan untuk mendapatkan string dari porsi waktu; hal seperti itu dapat dicapai dengan
toTimeString()
metode ini.The
toTimeString()
Metode ini sangat berguna karena mesin compliant menerapkan ECMA-262 mungkin berbeda dalam string yang diperoleh daritoString()
untukDate
benda-benda, seperti format adalah tergantung dari implementasi; pendekatan slicing string sederhana mungkin tidak menghasilkan hasil yang konsisten di banyak engine.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Dengan moment.js :
moment().format('zz');
Z
danZZ
Dengan momentjs, Anda dapat menemukan zona waktu saat ini sebagai
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Dengan dayjs, Anda dapat menemukan zona waktu saat ini sebagai
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Kedua API mengembalikan utc offset dalam hitungan menit.
getTimezoneOffset()
.
Zona waktu dalam jam-
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Jika Anda ingin tepat seperti yang Anda sebutkan dalam komentar, maka Anda harus mencoba seperti ini-
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Jika yang Anda butuhkan adalah singkatan zona waktu "MST" atau "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
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.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Seharusnya begitu floor
, bukan?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Contoh: Kamis 21 Juni 2018 18:12:50 GMT + 0530 (Waktu Standar India)
O / P: +0530
Date.toString()
tidak dapat diandalkan, dan MDN menjelaskan alasannya. Saya telah menempel bagian yang relevan dari dokumen mereka dalam jawaban saya .
Coba ini,
new Date().toString().split("GMT")[1].split(" (")[0]
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.
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Hasil
+8
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.
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:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
Sebagai alternatif new Date().getTimezoneOffset()
dan moment().format('zz')
, Anda juga bisa menggunakanmomentjs:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone juga cukup bermasalah dan tidak terawat ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Gunakan ini untuk mengonversi OffSet ke postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Saya hanya mencari string 3 huruf (seperti "PDT") dan mencoba jawaban Marquez tetapi harus sedikit men-tweak untuk dukungan lintas browser. Untungnya, string adalah pertandingan potensial terakhir :)
Inilah yang saya lakukan, di CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Bekerja di IE8, IE9, Safari 9, Firefox 44, dan Chrome 48
Date.toString()
tidak dapat diandalkan, dan MDN menjelaskan alasannya. Saya telah menempel bagian yang relevan dari dokumen mereka dalam jawaban saya .
Anda hanya perlu memasukkan moment.js dan jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
dan setelah itu
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
Anda bisa mencoba ini. itu akan mengembalikan Anda waktu mesin saat ini
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
itu akan menampilkan: "Jumat 28 Des 2018 10:15:23 GMT + 0100 (Waktu Standar Eropa Tengah) {}"