Получение часового пояса клиента в 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());

Рабочая Скрипку


попробовать getTimezoneOffset() на


JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);

С момент.js:

moment().format('zz');

С 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 меньше или больше.

enter image description here

см. документ MDN

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