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

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

+548
источник поделиться
25 ответов

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

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

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

+527
источник

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

Чтобы получить системный часовой пояс IANA в JavaScript, вам следует использовать

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

По состоянию на сентябрь 2019 года это работает в 95% браузеров, используемых во всем мире.

Старая информация о совместимости

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

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

в ecma-402/3.0, которая все еще находится в черновике, она изменилась на

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

+364
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

Если вы хотите, чтобы временная зона клиента была хорошо отформатирована, вы можете положиться на метод JavaScript Date.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]

Ссылка Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString

+118
источник

Уже ответили, как получить смещение в минутах как целое число, но в случае, если кто-то хочет, чтобы локальное смещение по часовой стрелке как строка, например. "+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))
+70
источник

Вы можете использовать:

момент- часовой пояс

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>

// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();

Обнаружение часового пояса браузера довольно сложно получить, поскольку информация, предоставляемая браузером, немного информации.

Moment Timezone использует Date.getTimezoneOffset() и Date.toString() в течение нескольких минут вокруг текущего года, чтобы собрать как можно больше информации о среде браузера. Затем он сравнивает эту информацию со всеми данными часового пояса и возвращает самое близкое соответствие. В случае связей возвращается часовой пояс с городом с наибольшей численностью населения.

console.log(moment.tz.guess()); // America/Chicago
+57
источник

Я написал функцию в моем проекте, которая возвращает часовой пояс в формате hh:mm. Надеюсь, это может помочь кому-то:

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());

Рабочая скрипта

+38
источник

попробуйте getTimezoneOffset() объекта Date:

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

Этот метод возвращает смещение часового пояса в минутах, что является разницей между GMT и местным временем в минутах.

+12
источник

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
+9
источник

Однострочник, который задает как смещение, так и часовой пояс, просто вызывает toTimeString() для нового объекта Date. Из MDN:

Метод toTimeString() возвращает часть времени объекта Date в удобочитаемой форме на американском английском языке.

Суть в том, что часовой пояс не в стандартном формате IANA; это несколько более удобно для пользователя, чем формат IANA "континент/город". Попробуйте:

console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);

В настоящее время в Калифорнии toTimeString() возвращает Pacific Daylight Time, а Intl API возвращает America/Los_Angeles. В Колумбии вы получите Colombia Standard Time против America/Bogota.

Обратите внимание, что многие другие ответы на этот вопрос пытаются получить ту же информацию, вызывая Date.toString(). Такой подход не настолько надежен, как объясняет MDN:

Даты экземпляров относятся к конкретному моменту времени. Вызов toString() вернет дату, отформатированную в удобочитаемой форме на американском английском. [...] Иногда желательно получить строку времени; это можно сделать с помощью метода toTimeString().

Метод toTimeString() особенно полезен, поскольку совместимые механизмы, реализующие ECMA-262, могут отличаться в строке, полученной из toString() для объектов Date, так как формат зависит от реализации; Простые подходы к нарезке строк могут не дать согласованных результатов для нескольких механизмов.

+7
источник

С moment.js:

moment().format('zz');
+6
источник

С помощью вы можете найти текущий часовой пояс как

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>

С помощью вы можете найти текущий часовой пояс как

console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/[email protected]/dayjs.min.js"></script>

Оба API возвращают смещение utc в минутах.

+5
источник

Часовой пояс в часах -

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));
}
+4
источник

Если вам понадобится аббревиатура часового пояса "MST" или "EST":

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}
+3
источник

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

введите описание изображения здесь

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

var a = new Date().getTimezoneOffset();

var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;

console.log(res)
+3
источник
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

+3
источник

Это значение от пользовательской машины, и его можно изменить в любое время, поэтому я думаю, что это не имеет значения, я просто хочу получить приблизительное значение и затем преобразовать его в 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
+2
источник

В new Date() вы можете получить смещение, чтобы получить имя часового пояса, которое вы можете сделать:

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

вы получаете значение между () в конце даты, то есть имя часового пояса.

+2
источник

Попробуй это,

new Date().toString().split("GMT")[1].split(" (")[0]
+2
источник

В качестве альтернативы new Date().getTimezoneOffset() и moment().format('zz') вы также можете использовать :

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)

+1
источник

Используйте это для преобразования OffSet в postive:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
+1
источник

Я искал только 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

-2
источник

Вы просто хотите включить moment.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>
-3
источник

Это очень хорошая работа для меня:

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
-3
источник

вы можете просто попробовать это. он вернет вам текущее время машины

var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())

-4
источник

Это выполнит задание.


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

undefined

-4
источник

Посмотрите другие вопросы по меткам или Задайте вопрос