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?
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?
Yanıtlar:
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 undefined
kullanı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.
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 Date
gibi 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 .
Bu betiği kullanabilirsiniz. http://pellepim.bitbucket.org/jstz/
Depoyu buraya çatal veya klonla. https://bitbucket.org/pellepim/jstimezonedetect
Komut dosyasını ekledikten sonra, jstz.olson.timezones
değişken içindeki saat dilimlerinin listesini alabilirsiniz .
İstemci tarayıcısının saat dilimini belirlemek için aşağıdaki kod kullanılır.
var tz = jstz.determine();
tz.name();
Jstz keyfini çıkarın!
Saat dilimini ada göre alın (ör. "Amerika / New York")
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
geri verir undefined
, ancak moment.tz.guess()
doğru değeri döndürür
Buradaki eşleme tablosunu kullanarak kendi kodunuzu yazabilirsiniz: http://www.timeanddate.com/time/zones/
veya an-saat dilimi kitaplığını kullanın: http://momentjs.com/timezone/docs/
Görmek zone.name; // America/Los_Angeles
veya bu kitaplık: https://github.com/Canop/tzdetect.js
Bu, GMT
eski 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.
UTC
/ için çalışıyor GMT
. Görünüşe göre diğerleri hecelenmiş; örneğin Pacific Daylight Time
,.
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>
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