Вопрос по javascript, timezone – Получение смещения часового пояса клиента в JavaScript

476

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

Заголовок запрашивает часовой пояс, а текст запрашивает смещение по Гринвичу. Это 2 разные вещи. Часовой пояс включает информацию о летнем времени, а смещение отсутствует. Часовой пояс имеет имя и историю, смещение - нет. Рекомендуем изменить заголовок на "Получение смещения gmt клиента в JS". citykid
Ответы здесь сосредоточены в основном наoffset, Заtime zone увидетьthis answer, Смотрите & quot; Часовой пояс! = Смещение & quot; вthe timezone tag wiki. Matt Johnson
Я сейчас решаю ту же проблему.Here is an interesting approach. Tamás Pap
Вы получаете точный часовой пояс с помощью этого Intl.DateTimeFormat (). ResolvedOptions (). TimeZone Mangesh Mandavgane
Мне нужен часовой пояс. Смещение по Гринвичу также будет полезно. DaveWalley

Ваш Ответ

23   ответа
-3

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

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

Вот как это должно быть сделано, я думаю:new Date(new Date().getTime());  будет отображаться: & quot; Пт 28 декабря 2018 10:15:23 GMT + 0100 (Центральноевропейское стандартное время) {} & quot;
466

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

The time-zone offset is the difference, in minutes, between UTC and local time. Note that this means that the offset is positive if the local timezone is behind UTC and negative if it is ahead. For example, if your time zone is UTC+10 (Australian Eastern Standard Time), -600 will be returned. Daylight savings time prevents this value from being a constant even for a given locale

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

Кажется, это не учитывает переход на летнее время
var hrs = -(new Date().getTimezoneOffset() / 60)  чтобы получить смещение в часах, которые обычно используются
@abernier Это стандарт, начиная с ES 1, так что я уверен, что любая проблема с реализацией может быть исправлена к настоящему времени, я имею в виду статью, которой 7 лет.
timezone != utc offset
@abernier Это утверждение оgetTimezoneOffset неточность в действии? Статья, на которую вы ссылаетесь, датирована июнем 2007 года и не содержит подробностей о том, как эта функция является неточной. А на самом деле библиотекаjsTimezoneDetect вы указали использованиеgetTimezoneOffset сам.
12

пытатьсяgetTimezoneOffset() изDate объект:

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

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

35

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

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

69

На него уже ответили, как получить смещение в минутах как целое число, но в случае, если кто-либо хочет локальное смещение по Гринвичу в виде строки, например,"+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))
Именно то, что я искал. Спасибо !
Вам необходимо заменить 1-й отступpad(parseInt(Math.abs(offset/60)), 2) чтобы сделать это правильно ... иначе вы могли бы в конечном итоге получить +5,530, как в моем случае ... я не уверен, что математический пол и т. д. здесь будет лучше или нет .... но это по крайней мере дает мне +0530, как и ожидалось
это даст правильный результат:this.pad(Math.floor((Math.abs(offset/60))), 2)
Вместо того, чтобы использовать вашу функцию pad, я считаю, что проще сделать это: offset = (offset & lt; 0? "+" & Quot; - "& quot;) + (" 0000 "+ parseInt ((Math.abs (offset /) 60)))). ломтик (-4)
0

Используйте это, чтобы преобразовать OffSet в позитивное:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
-2

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

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
Любое объяснение?
0

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

Хотя moment.js был отличной библиотекой того времени, в настоящее время есть гораздо меньшие альтернативы (dayjs, date-fns). Moment is huge; пожалуйста, не рекомендуйте его для клиентских приложений.
2

Если все, что вам нужно, это & quot; MST & quot; или «EST»; сокращение часового пояса:

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}
С помощьюDate.toString() не является надежным, и MDN объясняет почему. Я вставил соответствующий раздел из их документов вmy answer.
2
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

С помощьюDate.toString() не является надежным, и MDN объясняет почему. Я вставил соответствующий раздел из их документов вmy answer.
2

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

enter image description here

See the MDN document

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

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

console.log(res)

Зачемround? Так должно бытьfloorне так ли?
в случае отрицательного значения, некоторые проблемы
-1

Я искал только трехбуквенную строку (например, «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

Хотя есть часовые пояса с 4 буквами - будьте осторожны: например, CEST (Центральноевропейское летнее время)
С помощьюDate.toString() не является надежным, и MDN объясняет почему. Я вставил соответствующий раздел из их документов вmy answer.
1

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

Result

+8
-2

<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>
113

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

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

@adimauro .. теперь работает в IE11;)
Это также не работает (неожиданно, неожиданно) в IE. Я только что сделал консольный дамп разделенного объекта Date. Оно одинаково в Chrome, Firefox и Safari, но отличается в IE. Таким образом, вы также не можете рассчитывать на постоянные индексы. Понедельник 02.12.2013 10:22:50 GMT-0500 (EST): Chrome, FF, Safari; Пн 2 декабря 10:22:50 EST 2013: IE10
Черт возьми спасибо! Я прыгал через обручи, пытаясь отобразить часовой пояс браузера ..... ew Date (). ToString (). Match (/ ([AZ] + [\ + -] [0-9] +. *) /) [ 1] было именно то, что мне было нужно!
Это на самом деле не очень хорошая идея фактического представления времени JS после того, как выnew Date().toString() полностью зависит от ваших региональных настроек. Ожидая других клиентов & apos; выходы, напоминающие ваши, очень плохая идея.
Сломан с Chrome, так как он добавляет название часового пояса. Не используйте split.length, а вместо этого постояннуюsplit[4] + " " + split[5] ?!
0

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

The toTimeString() method returns the time portion of a Date object in human readable form in American English.

Суть в том, что часовой пояс не в стандартном формате 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 (). Такой подход не так надежен, какМДН объясняет:

Date instances refer to a specific point in time. Calling toString() will return the date formatted in a human readable form in American English. [...] Sometimes it is desirable to obtain a string of the time portion; such a thing can be accomplished with the toTimeString() method.

The toTimeString() method is especially useful because compliant engines implementing ECMA-262 may differ in the string obtained from toString() for Date objects, as the format is implementation-dependent; simple string slicing approaches may not produce consistent results across multiple engines.

277

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

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

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

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


Old compatibility information

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

In this version of the ECMAScript Internationalization API, the timeZone property will remain undefined if no timeZone property was provided in the options object provided to the Intl.DateTimeFormat constructor. However, applications should not rely on this, as future versions may return a String value identifying the host environment’s current time zone instead.

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

In this version of the ECMAScript 2015 Internationalization API, the timeZone property will be the name of the default time zone if no timeZone property was provided in the options object provided to the Intl.DateTimeFormat constructor. The previous version left the timeZone property undefined in this case.

Это единственный ответ для получения часового пояса, который может понадобиться некоторым пользователям, а не только смещению. Итак, как обновление 2016-09, Intl работает на большинстве современных браузеров, но не на Safari. Для этого браузера здесь достаточно точный запасной вариант JavaScript -pellepim.bitbucket.org/jstz
Было бы неплохо, если бы это работало во всех современных браузерах. Однако IE11 и последний Firefox оба возвращают undefined для свойства timeZone.
Я тестировал сейчас с Chrome 58, Edge 40 и Firefox 53 - все будет работать. Он не работает с IE 11, я не тестировал Opera.
Мне потребовалось некоторое время, чтобы найти список часовых поясов, возвращаемых этим API. Вот:en.wikipedia.org/wiki/List_of_tz_database_time_zones
Проверено, что это теперь, кажется, работает в Safari. (С использованием версии 10.0)
2

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

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 в минутах.

Больше информации

Хотя moment.js был отличной библиотекой того времени, в настоящее время есть гораздо меньшие альтернативы (dayjs, date-fns). Moment is huge; пожалуйста, не рекомендуйте его для клиентских приложений.
-3

Это сделает работу.


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

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

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

54

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

moment-timezone

<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
Это должен быть принятый ответ. Это единственный, который дает фактический часовой поясname а не смещение. Помните, что смещение часового пояса может быть получено из имени, обратное неверно. Из-за летнего времени и других тонкостей, несколько часовых поясов могут иметь одинаковое смещение только в определенные дни года.
Для этого сейчас есть нативное решение -Intl API, Хотя moment.js был отличной библиотекой того времени, в настоящее время есть гораздо меньшие альтернативы (dayjs, date-fns). Moment is huge; пожалуйста, не рекомендуйте его для клиентских приложений.
6

Сmoment.js:

moment().format('zz');
@brauliobo Эти параметры не возвращают одно и то же. z и zz вернули часовой пояс, например, CST, но Z и ZZ возвращают смещение, например -0600.
Хотя moment.js был отличной библиотекой того времени, в настоящее время есть гораздо меньшие альтернативы (dayjs, date-fns). Moment is huge; пожалуйста, не рекомендуйте его для клиентских приложений.
Последние документы показывают.zoneAbbr() заменилzа такжеzz, Смотри документациюhere
z а такжеzz устарел по состоянию на 1.6.0 см.momentjs.com/docs/#/displaying/format
@MrUpsidown сейчасZ а такжеZZ
8

JavaScript:

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

@DanDascalescu Простота.
Что дает этот ответ, что предыдущие ответы не имели?
1

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

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

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

С помощьюDate.toString() не является надежным, и MDN объясняет почему. Я вставил соответствующий раздел из их документов вmy answer, Также этот ответ был дан как минимум 3 раза.

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