Получение часового пояса клиента в JavaScript
Как я могу собрать информацию о часовом поясе посетителя? Мне нужен часовой пояс, а также часы смещения GMT.
23 ответов
var offset = new Date().getTimezoneOffset();
console.log(offset);
смещение часового пояса-это разница в минутах, между UTC и местным временем. Обратите внимание, что это означает, что смещение является положительным, если локальный часовой пояс находится за UTC и отрицательным, если он впереди. Например, если ваш часовой пояс UTC+10 (австралийское Восточное стандартное время), -600 будет возвращен. Летнее время не позволяет этому значению быть постоянным даже для данной локали
обратите внимание, что не все часовые пояса смещены на целые часы: например, Ньюфаундленд-UTC минус 3h 30m (оставляя летнее время вне уравнения).
использование смещения для расчета часового пояса-неправильный подход, и вы всегда будете сталкиваться с проблемами. Часовые пояса и правила летнего времени могут меняться несколько раз в течение года, и трудно идти в ногу с изменениями.
чтобы получить правильный часовой пояс в JavaScript, вы должны использовать
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
к сожалению, к моменту написания этого, он еще не получил широкой поддержки.
Я знаю, что он работает правильно, по крайней мере, в Хром.
есма-402/1.0 говорит, что timeZone
может быть не определено, если не предоставлено конструктору. Однако future draft (3.0) исправил эту проблему, изменив часовой пояс по умолчанию.
в этой версии API интернационализации ECMAScript
timeZone
свойство останется неопределенным, если нетtimeZone
собственность была предоставленный в опции объект, предоставленный вIntl.DateTimeFormat
конструктор. Однако заявки не должны полагаться на это, поскольку будущее versions может возвращать строковое значение, идентифицирующее среду хоста вместо этого текущий часовой пояс.
в ecma-402/3.0, который все еще находится в черновике, он изменился на
в этой версии API интернационализации ECMAScript 2015,
timeZone
свойство будет именем часового пояса по умолчанию, если нетtimeZone
свойство было предоставлено в объекте options, предоставленномIntl.DateTimeFormat
конструктор. Предыдущая версия оставилаtimeZone
свойство undefined в этом случае.
поэтому перед использованием проверьте текущую поддержку в браузерах
например at:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions
Я понимаю, что этот ответ немного не по теме, но я думаю, что многие из нас ищут ответ, также хотели отформатировать часовой пояс для отображения и, возможно, получить аббревиатуру зоны. Ну вот и все...
если вы хотите, чтобы часовой пояс клиента был хорошо отформатирован, вы можете положиться на дату JavaScript.метод toString и do:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Это даст вам " GMT-0400 (EST)", например, включая минуты часового пояса, когда это применимо.
кроме того, с regex вы можете извлечь любую нужную часть:
для " GMT-0400 (EDT)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
для "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
для просто "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
просто "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
дата.ссылка на toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
уже ответили, Как получить смещение в минутах как целое число, но в случае, если кто-то хочет локальное смещение GMT в виде строки, например "+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))
вы можете использовать:
время-часовой пояс
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
обнаружение часового пояса браузера довольно сложно получить право, так как есть мало информации, предоставляемой браузером.
момент часовой пояс использует Date.getTimezoneOffset()
и Date.toString()
на несколько моментов вокруг текущего года, чтобы собрать как можно больше информации о среде браузера, как это возможно. Затем он сравнивает эту информацию со всеми загруженными данными часового пояса и возвращает ближайшее совпадение. В случае связей, возвращается часовой пояс с городом с наибольшим населением.
console.log(moment.tz.guess()); // America/Chicago
Я написал функцию в своем проекте, которая возвращает часовой пояс в . Я надеюсь, что это может помочь кому-то:
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
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);
}
// See output
document.write(getTimeZone());
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
С momentjs, вы можете найти текущий часовой пояс, как
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>
он возвращает смещение utc в минутах.
Если все, что вам нужно, это" MST "или аббревиатура часового пояса" EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'');//extracts the content between parenthesis
return timeZone;
}
часовой пояс в часах-
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);
Если вы хотите быть точным, как вы упомянули в комментарии, то вы должны попробовать, как это-
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));
}
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;
}
пример: Чт 21 июня 2018 18:12: 50 GMT+0530 (стандартное время Индии)
O / P: +0530
Это значение с машины пользователя, и его можно изменить в любое время, поэтому я думаю, что это не имеет значения, я просто хочу получить приблизительное значение, а затем преобразовать его в GMT на моем сервере.
например, Я из Тайваня, и он возвращает "+8 " для меня.
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>
результат
+8
см. этот результирующий оператор был противоположен часовому поясу .Поэтому примените некоторую математическую функцию, а затем проверьте num меньше или больше.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
на new Date(
) вы можете получить смещение, чтобы получить имя часового пояса вы можете сделать:
new Date().toString().replace(/(.*\((.*)\).*)/, '');
вы получаете значение между ()
в конце даты, это имя часового пояса.
в качестве альтернативы new Date().getTimezoneOffset()
и moment().format('zz')
, вы также можете использовать momentjs:
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 также довольно глючит и не поддерживается (https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open)
используйте это для преобразования смещения в postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Я искал только строку из 3 букв (например, "PDT") и попробовал ответ Маркеса, но должен был немного настроить его для поддержки кросс-браузера. К счастью, строка является последним потенциальным совпадением:)
вот что я сделал, в CoffeeScript:
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 и Chrome 48
вы просто чтобы включить момент.js и 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>
и после этого
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
Это очень хорошая работа для меня:
// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
вы можете просто попробовать это. он вернет вам текущее машинное время
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
это сделает работу.
var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);
Thu May 25 2017 21:35:14 GMT+0300 (IDT)
undefined