Bagaimana saya bisa mendapatkan nama zona waktu di JavaScript?

117

Saya tahu cara mengimbangi zona waktu, tetapi yang saya butuhkan adalah kemampuan untuk mendeteksi sesuatu seperti "Amerika / New York". Apakah itu mungkin dari JavaScript atau apakah itu sesuatu yang harus saya beri guestimate berdasarkan offset?

Mike Thomsen
sumber
2
Berikut adalah fungsi Jon Nylander menulis, mungkin itu membantu bitbucket.org/pellepim/jstimezonedetect
yunzen
Berikut jawaban terkait yang mungkin membantu: stackoverflow.com/a/19421672/1447034
Douglas

Jawaban:

242

The Internasionalisasi API mendukung mendapatkan zona waktu pengguna, dan didukung di semua browser saat ini.

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

Perlu diingat bahwa pada beberapa versi browser lama yang mendukung Internationalization API, timeZoneproperti disetel ke undefineddaripada string zona waktu pengguna. Sejauh yang saya tahu, pada saat penulisan (Juli 2017) semua browser saat ini kecuali IE11 akan mengembalikan zona waktu pengguna sebagai string.

Daniel Compton
sumber
6
Tidak pernah berpikir ini sesederhana ini
Mohammed Shareef C
5
luar biasa, yang pertama saya lihat yang tidak menggunakan momen! Terima kasih
r0bb077
3
Solusi luar biasa. Tidak ingin menyertakan seluruh plugin zona waktu untuk ini.
Joan Gil
1
solusi yang sangat sederhana dan bagus!
blackiii
2
@DanielCompton oh saya tidak tahu tentang tabel ini, terima kasih telah memperbaikinya lagi.
CommonSenseCode
9

Jawaban yang paling banyak disukai mungkin adalah cara terbaik untuk mendapatkan zona waktu, namun, Intl.DateTimeFormat().resolvedOptions().timeZonemengembalikan nama zona waktu IANA menurut definisi, dalam bahasa Inggris.

Jika Anda ingin nama zona waktu dalam bahasa pengguna saat ini, Anda dapat menguraikannya dari Daterepresentasi string seperti:

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

Diuji di Chrome dan Firefox.

Tentu saja, ini tidak akan berfungsi sebagaimana mestinya di beberapa lingkungan. Misalnya, node.js mengembalikan offset GMT (misalnya GMT+07:00) sebagai ganti nama. Tapi saya pikir itu masih bisa dibaca sebagai fallback.

PS Tidak akan berfungsi di IE11, hanya sebagai Intl...solusinya.

mrnateriver.dll
sumber
3

Ambil zona waktu menurut nama (yaitu "Amerika / New York")

moment.tz.guess();
Omer
sumber
10
Tolong, sebutkan bahwa itu juga mungkin tanpa ketergantungan apa pun:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322
1
Ya, meskipun moment-js juga menebak TZ untuk "browser" yang tidak mendukung fitur tersebut. :)
Ferran Maylinch
di IE11 Intl.DateTimeFormat().resolvedOptions().timeZonememberikan kembali undefined, tetapi moment.tz.guess()mengembalikan nilai yang benar
Antoni4
0

Ini mendapatkan kode zona waktu (mis., GMT) Di javascript lama (Saya menggunakan skrip aplikasi google dengan mesin lama):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

Saya hanya meletakkan ini di sini jika seseorang membutuhkannya.

toddmo
sumber
1
Saya pikir itu hanya berfungsi untuk UTC/ GMT. Sepertinya orang lain dibilang; mis Pacific Daylight Time. , .
Ian Dunn
-1

Coba kode ini merujuk dari sini

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>
Kumar Shanmugam
sumber
-5

Dalam javascript, metode Date.getTimezoneOffset () mengembalikan offset zona waktu dari UTC, dalam menit, untuk lokal saat ini.

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Zona waktu akan menjadi alat yang berguna. http://momentjs.com/timezone/

Ubah Tanggal Antar Zona Waktu

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00
pengguna3345614
sumber
4
Anda tidak memahami antrean.
srsajid
3
Contoh kode Anda tidak terkait dengan pertanyaan awal. Bagaimana Anda akan menggunakan pustaka ini untuk mengembalikan nama zona waktu pengguna saat ini?
Joe White