Получение часового пояса клиента в JavaScript



Как я могу собрать информацию о часовом поясе посетителя? Мне нужен часовой пояс, а также часы смещения GMT.

814   23  

23 ответов:

var offset = new Date().getTimezoneOffset();
console.log(offset);

смещение часового пояса-это разница в минутах между UTC и местным временем. Обратите внимание, что это означает, что смещение является положительным, если локальный часовой пояс находится позади UTC и отрицательным, если он впереди. Например, если ваш часовой пояс UTC+10 (Australian Eastern Standard Time), -600 будет возвращено. Переход на летнее время не позволяет этому значению быть постоянным даже для данной локали

обратите внимание, что не все часовые пояса смещены на целые часы: например, Ньюфаундленд-это UTC минус 3h 30m (оставляя летнее время вне уравнения).

использование смещения для расчета часового пояса является неправильным подходом, и вы всегда будете сталкиваться с проблемами. Часовые пояса и правила перехода на летнее время может меняться несколько раз в течение года, и это трудно идти в ногу с изменениями.

чтобы получить правильный часовой пояс в JavaScript, вы должны использовать

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

к сожалению, на момент написания этого, он еще не получил широкой поддержки.
Я знаю, что он работает правильно, по крайней мере, в Хром.

есма-402/1.0 говорит, что timeZone может быть неопределенным, если не предоставлено конструктору. Тем не менее, будущий проект (3.0) исправил эту проблему, изменив на системный часовой пояс по умолчанию.

в этой версии API интернационализации ECMAScript timeZone свойство останется неопределенным, если нет timeZone собственность была предоставлено в объекте options, предоставленном Intl.DateTimeFormat конструктор. Однако, приложения не должны полагаться на это, как будущее версии могут возвращать строковое значение, идентифицирующее среду хоста вместо этого текущий часовой пояс.

в ecma-402/3. 0, который все еще находится в проекте, он изменился на

в этой версии ECMAScript 2015 Internationalization API, timeZone свойство будет именем часового пояса по умолчанию, если нет timeZone свойство было предоставлено в объекте options, предоставленном Intl.DateTimeFormat конструктор. Предыдущая версия оставила timeZone свойство не определено в этом случае.

поэтому перед его использованием проверьте текущую поддержку в браузерах например at:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions

Я понимаю, что этот ответ немного не по теме, но я думаю, что многие из нас ищут ответ также хотел отформатировать часовой пояс для отображения и, возможно, получить аббревиатуру зоны тоже. Так что вот оно...

если вы хотите, чтобы часовой пояс клиента был хорошо отформатирован, вы можете полагаться на дату JavaScript.toString метод и сделать:

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

Это даст вам " GMT-0400 (EST)", например, включая минуты часового пояса, когда это применимо.

кроме того, с регулярное выражение Вы можете извлечь любую нужную часть:

для " 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]

дата.ссылка на строку: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

см. этот результирующий оператор был противоположен часовому поясу. поэтому примените некоторую математическую функцию, а затем проверьте число меньше или больше.

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)

использовать это, чтобы преобразовать смещение положительных:

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)

неопределено

Comments

    Ничего не найдено.