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

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

494
07 июля '09 в 12:48
источник поделиться
25 ответов

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

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

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

483
07 июля '09 в 12:53
источник

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


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

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

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

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

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


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

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

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

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

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

291
05 янв. '16 в 4:07
источник

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

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

115
09 марта '13 в 1:50
источник

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

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

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

<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
55
05 нояб. '16 в 9:09
источник

Я написал функцию в моем проекте, которая возвращает часовой пояс в формате 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());

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

35
21 мая '15 в 17:55
источник

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

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

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

12
07 июля '09 в 12:51
источник

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
8
14 июня '16 в 23:14
источник

С moment.js:

moment().format('zz');
6
11 июля '14 в 13:30
источник

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

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/dayjs@1.8.10/dayjs.min.js"></script>

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

4
13 июля '15 в 21:02
источник

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

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));
}
3
07 марта '17 в 6:52
источник

Однострочник, который дает как смещение, так и часовой пояс, заключается в простом вызове 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, поскольку формат зависит от реализации; Простые подходы к нарезке строк могут не дать согласованных результатов для нескольких движков.

2
17 марта '19 в 9:36
источник
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

2
21 июня '18 в 15:51
источник

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

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

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

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

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

console.log(res)
2
18 июля '17 в 17:07
источник

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

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}
2
11 янв. '17 в 4:04
источник

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

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

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

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

1
08 мая '18 в 18:13
источник

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

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
0
24 марта '17 в 11:09
источник

В качестве альтернативы 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)

0
10 июня '15 в 16:42
источник

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

new Date().toString().split("GMT")[1].split(" (")[0]
0
29 марта '19 в 16:28
источник

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

-1
16 марта '16 в 8:54
источник

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

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
-2
24 апр. '17 в 0:08
источник

Вы просто хотите включить 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>
-2
19 дек. '16 в 17:04
источник

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


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

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

undefined

-3
25 мая '17 в 21:35
источник

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

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

-3
25 мая '17 в 21:10
источник

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