Ziyaretçinin saat dilimi bilgilerini nasıl toplayabilirim? Timezone'a ve GMT ofset saatlerine ihtiyacım var.
Ziyaretçinin saat dilimi bilgilerini nasıl toplayabilirim? Timezone'a ve GMT ofset saatlerine ihtiyacım var.
Yanıtlar:
var offset = new Date().getTimezoneOffset();
console.log(offset);
Saat dilimi farkı, UTC ve yerel saat arasındaki dakika cinsinden farktır. Bunun, yerel saat dilimi UTC'nin arkasındaysa ofsetin pozitif ve ileride negatif olduğu anlamına gelir. Örneğin, saat diliminiz UTC + 10 (Avustralya Doğu Standart Saati) ise, -600 döndürülür. Yaz saati uygulaması, bu değerin belirli bir bölge için bile sabit olmasını önler
Tüm saat dilimlerinin saatlerce dengelenmediğine dikkat edin: örneğin, Newfoundland UTC eksi 3h 30m'dir (Yaz Saati Uygulaması denklemin dışında kalır).
getTimezoneOffset
yürürlükte mi? Bahsettiğiniz makale Haziran 2007 tarihlidir ve işlevin nasıl yanlış olduğuna dair hiçbir ayrıntıya sahip değildir. Ve aslında jsTimezoneDetect
işaret ettiğin kütüphane getTimezoneOffset
kendini kullanıyor .
var hrs = -(new Date().getTimezoneOffset() / 60)
kullanılan saatler içinde ofset almak için
timezone
! =utc offset
Zaman dilimini hesaplamak için bir ofset kullanmak yanlış bir yaklaşımdır ve her zaman sorunlarla karşılaşırsınız. Zaman dilimleri ve gün ışığından yararlanma kuralları bir yıl boyunca birkaç kez değişebilir ve değişikliklere ayak uydurmak zordur.
Sistemin IANA saat dilimini JavaScript olarak almak için şunu kullanmalısınız:
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0, kurucuya verilmezse timeZone
tanımsız olabileceğini söylüyor . Ancak, gelecekteki taslak (3.0) sistem varsayılan saat dilimine geçerek bu sorunu çözdü.
ECMAScript Uluslararasılaşma API Bu versiyonda,
timeZone
hiçbir eğer mülkiyet tanımsız kalırtimeZone
mülkiyet sağlanan nesnesi seçeneklerinde sağlandıIntl.DateTimeFormat
yapıcısı . Ancak, gelecek sürümler ana bilgisayar ortamının geçerli saat dilimini tanımlayan bir String değeri döndürebileceğinden, uygulamalar buna güvenmemelidir.
hala taslakta olan ecma-402 / 3.0'da
ECMAScript 2015 Uluslararasılaştırma API'sının bu sürümünde, yapıcıya sağlanan seçenekler nesnesinde
timeZone
hiçbirtimeZone
özellik sağlanmadıysa, özellik varsayılan saat diliminin adı olacaktırIntl.DateTimeFormat
. Önceki sürümtimeZone
, bu durumda özelliği tanımsız bıraktı .
Bu cevabın biraz konu dışı olduğunu anlıyorum, ancak çoğumuzun görüntüleme için saat dilimini biçimlendirmek ve belki de bölge kısaltmasını almak isteyen bir cevap aradığımızı hayal ediyorum. İşte gidiyor ...
İstemci saat diliminin iyi biçimlendirilmesini istiyorsanız JavaScript Date.toString yöntemine güvenebilir ve şunları yapabilirsiniz:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Bu, örneğin, geçerli olduğunda saat dilimi dakikaları dahil, size "GMT-0400 (EST)" verecektir.
Alternatif olarak, regex ile istediğiniz herhangi bir parçayı çıkarabilirsiniz:
"GMT-0400 (EDT)" için:
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
"GMT-0400" için:
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Sadece "EDT" için:
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Sadece "-0400" için:
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Date.toString referansı: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?
split
içerir: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
yani sonuçDaylight Time)
new Date().toString()
tamamen yerel ayarlarınıza bağlıdır iyi bir fikir değildir . Diğer müşterilerin çıktılarının sizinkine benzemesini beklemek çok kötü bir fikirdir.
Bir tamsayı olarak dakikalar içinde nasıl dengeleneceği zaten cevaplanmıştır, ancak herhangi birinin yerel GMT ofsetini bir dize olarak istemesi durumunda, örneğin "+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)
... aksi takdirde benim durumumda olduğu gibi +5.530 elde edebilirsiniz ... im matematik kat vb burada daha iyi bir şey olup olmayacağından emin değilim .... ama bu atleast bana beklendiği gibi + 0530 veriyor
Kullanabilirsiniz:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Tarayıcı zaman dilimi algılaması, tarayıcı tarafından sağlanan çok az bilgi olduğu için, doğru şekilde almak oldukça zordur.
Moment Timezone , tarayıcı ortamı hakkında mümkün olduğunca fazla bilgi toplamak için mevcut yıl boyunca Date.getTimezoneOffset()
ve Date.toString()
bir avuç anı kullanır . Daha sonra bu bilgileri yüklenen tüm saat dilimi verileriyle karşılaştırır ve en yakın eşleşmeyi döndürür. Bağlar olması durumunda, en fazla nüfusa sahip şehrin saat dilimi döndürülür.
console.log(moment.tz.guess()); // America/Chicago
Projemde saat dilimini hh:mm
biçiminde döndüren bir işlev yazdım . Umarım bu birine yardımcı olabilir:
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
Hem uzaklığı hem de saat dilimini veren tek satır , yeni bir Date nesnesinde yalnızca toTimeString () öğesini çağırmaktır . MDN'den:
toTimeString()
Yöntem Amerikan İngilizcesi Okunabilir biçimde Date nesnesinin saat bölümünü döndürür.
Yakalama, saat diliminin standart IANA biçiminde olmamasıdır; "kıta / şehir" IANA biçiminden biraz daha kullanıcı dostudur . Denemek:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
California'da şu anda toTimeString()
döner Pacific Daylight Time
Intl API döndürür iken America/Los_Angeles
. Kolombiya'da olsun istiyorum Colombia Standard Time
, vsAmerica/Bogota
.
Bu soruya verilecek diğer pek çok yanıtın Date.toString () yöntemini çağırarak aynı bilgileri almaya çalıştığını unutmayın. MDN'nin açıkladığı gibi bu yaklaşım o kadar güvenilir değildir :
Tarih örnekleri, zaman içindeki belirli bir noktayı ifade eder. ToString () öğesini çağırmak, Amerikan İngilizcesinde okunabilir bir biçimde biçimlendirilen tarihi döndürür. [...] Bazen zaman bölümünün bir dizesinin elde edilmesi arzu edilir; böyle bir şey,
toTimeString()
.
toTimeString()
ECMA-262 uygulanması uyumlu bir motor elde dizede farklı olabilir, çünkü yöntem özellikle faydalıdırtoString()
içinDate
biçimi uygulama bağımlı olarak, nesnelerin; basit dizi dilimleme yaklaşımları birden fazla motorda tutarlı sonuçlar vermeyebilir.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
İle moment.js :
moment().format('zz');
Z
veZZ
İle momentjs, geçerli saat dilimini şu şekilde bulabilirsiniz:
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>
İle dayjs, geçerli saat dilimini şu şekilde bulabilirsiniz:
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>
Her iki API da dakikalar içinde utc ofseti döndürür.
getTimezoneOffset()
.
Saat diliminde saat dilimi
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);
Yorumda belirttiğiniz gibi kesin olmak istiyorsanız, bu şekilde denemelisiniz.
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));
}
İhtiyacınız olan tek şey "MST" veya "EST" saat dilimi kısaltmasıysa:
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
güvenilir değildir ve MDN bunun nedenini açıklar. Ben onların dokümanlardan ilgili bölümü yapıştırdıktan Cevabıma .
Bu sonuç operatörünün saat dilimine zıt olduğunu görün.Biraz matematik işlevi uygulayın, sonra num'u daha az veya daha fazla doğrulayın.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Olmalı floor
, değil mi?
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;
}
Örnek: 21 Haziran 2018, Per 18:12:50 GMT + 0530 (Hindistan Standart Saati)
O / P: +0530
Date.toString()
güvenilir değildir ve MDN bunun nedenini açıklar. Ben onların dokümanlardan ilgili bölümü yapıştırdıktan Cevabıma .
Bunu dene,
new Date().toString().split("GMT")[1].split(" (")[0]
Bu değer kullanıcının makinesinden ve her zaman değiştirilebilir, bu yüzden önemli olmadığını düşünüyorum, sadece yaklaşık bir değer almak ve daha sonra sunucumda GMT'ye dönüştürmek istiyorum.
Örneğin, Tayvanlıyım ve benim için "+8" döndürüyor.
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>
Sonuç
+8
Üzerinde new Date(
) yapabileceğiniz saat dilimi adını almak için ofseti alabilirsiniz:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
()
tarihin sonundaki, yani saat diliminin adı arasındaki değeri alırsınız .
Date.toString()
güvenilir değildir ve MDN bunun nedenini açıklar. Ben onların dokümanlardan ilgili bölümü yapıştırdıktan Cevabıma . Ayrıca, bu cevap en az 3 kez verilmiştir.
Bu benim çözümüm olurdu:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
Alternatif olarak new Date().getTimezoneOffset()
vemoment().format('zz')
, ayrıca kullanabilirsinizmomentjs:
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 da oldukça buggy ve bakımsız ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
OffSet'i postive dönüştürmek için bunu kullanın:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Sadece 3 harfli dize ("PDT" gibi) arıyordu ve Marquez'in cevabını denedim ama çapraz tarayıcı desteği için biraz ince ayar yapmak zorunda kaldım. Neyse ki, dize son potansiyel eşleşme :)
İşte yaptığım şey, CoffeeScript'te:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
IE8, IE9, Safari 9, Firefox 44 ve Chrome 48'de çalışır
Date.toString()
güvenilir değildir ve MDN bunun nedenini açıklar. Ben onların dokümanlardan ilgili bölümü yapıştırdıktan Cevabıma .
Sadece moment.js ve jstz.js'yi dahil etmelisiniz
<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>
ve ondan sonra
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
bunu deneyebilirsiniz. mevcut makine zamanını döndürür
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
: "Cum 28 Aralık 2018 10:15:23 GMT + 0100 (Orta Avrupa Standart Saati) {}"