Zaman dilimi adını JavaScript'te nasıl alabilirim?


118

Saat dilimini nasıl kaydıracağımı biliyorum, ancak ihtiyacım olan şey "Amerika / New York" gibi bir şeyi algılama yeteneği. Bu JavaScript'ten bile mümkün mü yoksa bu, ofsete dayalı olarak tahmin etmem gereken bir şey mi?


2
İşte Jon Nylander yazdığı bir fonksiyonudur, belki de yardımcı bitbucket.org/pellepim/jstimezonedetect
yunzen


Yanıtlar:


243

Uluslararasılaşma API destekler kullanıcı zaman dilimini almak ve desteklenen tüm mevcut tarayıcılarla.

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

Uluslararasılaştırma API'sini destekleyen bazı eski tarayıcı sürümlerinde, timeZoneözelliğin undefinedkullanıcının saat dilimi dizesi yerine ayarlandığını unutmayın . Söyleyebileceğim kadarıyla, yazım sırasında (Temmuz 2017) , IE11 dışındaki tüm mevcut tarayıcılar , kullanıcının saat dilimini bir dize olarak döndürecektir.


6
Bunun bu kadar basit olduğunu hiç düşünmemiştim
Mohammed Shareef C

5
harika, anı kullanmayan ilk gördüm! Teşekkürler
r0bb077

3
Harika çözüm. Bunun için tüm zaman dilimi eklentisini dahil etmek istemedim.
Joan Gil

1
çok basit ve güzel bir çözüm!
blackiii

2
@DanielCompton oh Bu tabloyu bilmiyordum, tekrar düzelttiğiniz için teşekkürler.
CommonSenseCode

9

En çok oy verilen yanıt , muhtemelen saat dilimini almanın en iyi yoludur, ancak, Intl.DateTimeFormat().resolvedOptions().timeZoneİngilizce olan IANA saat dilimi adını tanımı gereği döndürür.

Saat diliminin adını mevcut kullanıcının dilinde istiyorsanız, bunu aşağıdaki Dategibi dizgi gösteriminden ayrıştırabilirsiniz :

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());

Chrome ve Firefox'ta test edilmiştir.

Elbette, bu bazı ortamlarda tasarlandığı gibi çalışmayacaktır. Örneğin, node.js GMT+07:00, bir ad yerine bir GMT uzaklığı (örneğin ) döndürür . Ama yine de bir yedek olarak okunabilir olduğunu düşünüyorum.

PS, Intl...çözüm olarak IE11'de çalışmayacak .



3

Saat dilimini ada göre alın (ör. "Amerika / New York")

moment.tz.guess();

10
Lütfen, herhangi bir bağımlılık olmadan da mümkün olduğunu Intl.DateTimeFormat().resolvedOptions().timeZone
belirtin

1
Evet, moment-js bu özelliği desteklemeyen "tarayıcılar" için TZ'yi de tahmin etse de. :)
Ferran Maylinch

IE11'de Intl.DateTimeFormat().resolvedOptions().timeZonegeri verir undefined, ancak moment.tz.guess()doğru değeri döndürür
Antoni4


0

Bu, GMTeski javascript'teki saat dilimi kodunu (örn. ) Alır ( eski motorla google app komut dosyasını kullanıyorum):

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

Birisinin ihtiyacı olursa diye bunu buraya koyuyorum.


1
Sanırım bu sadece UTC/ için çalışıyor GMT. Görünüşe göre diğerleri hecelenmiş; örneğin Pacific Daylight Time,.
Ian Dunn

-1

Bu kodu buradan deneyin

<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>

-5

Javascript'te, Date.getTimezoneOffset () yöntemi geçerli yerel ayar için dakika cinsinden UTC'den saat dilimi uzaklığını döndürür.

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

Moment'timezone kullanışlı bir araç olacaktır. http://momentjs.com/timezone/

Tarihleri ​​Saat Dilimleri Arasında Dönüştürme

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

4
Sırayı anlamadın.
srsajid

3
Kod örnekleriniz orijinal soruyla ilgili değil. Kullanıcının mevcut saat diliminin adını döndürmek için bu kitaplığı nasıl kullanırsınız?
Joe White
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.