Обнаружение сокращений часового пояса с помощью JavaScript

Мне нужен способ определения часового пояса данного объекта даты. Я НЕ хочу смещение, и я не хочу полного имени часового пояса. Мне нужно получить сокращение от часовой пояс. Например, GMT, UTC, PST, MST, CST, EST и т.д.

Возможно ли это? Самое близкое, что я получил, - это синтаксический анализ результата date.toString(), но даже это не даст мне аббревиатуры. Это дает мне длинное имя часового пояса.

Ответ 2

Натуральное решение:

var zone = new Date().toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2]
console.log(zone)

Ответ 3

[извините за то, что я пишу по-английски]

Привет, объект date не имеет метода для получения сокращения абзаца часового пояса, но он скрыт там почти в конце возврата toString:

например

var rightNow = new Date();
alert(rightNow);

выход будет чем-то вроде "Wed Mar 30 2011 17:29:16 GMT-0300 (ART)" поэтому вы можете выделить то, что находится между скобками "ART", которое является сокращением часового пояса

var rightNow = new Date();
alert(String(String(rightNow).split("(")[1]).split(")")[0]);

вывод будет "ART"

чтобы ответить позже, но я надеюсь, что это будет полезно для кого-то.

Ответ 4

момент-часовой пояс включает недокументированный метод .zoneAbbr() который возвращает аббревиатуру часового пояса. Для этого также требуется набор правил, которые доступны для выбора и загрузки по мере необходимости.

Делая это:

<script src="moment.js"></script>
<script src="moment-timezone.js"></script>
<script src="moment-timezone-data.js"></script>
<script>
    moment().tz("America/Los_Angeles").zoneAbbr();
</script>

Возвращает:

'PDT' // As of this posting.

Редактировать (февраль 2018)

Эван Чаплицки работал над проектом предложения о добавлении API часовых поясов в браузеры.

Ответ 5

Это отлично работает в Chrome, Firefox, но только в IE11. В IE11 временные интервалы без прямых сокращений, таких как "Indian Chagos Time", вернут "ИКТ" вместо правильного "IOT",

var result = "unknown";
try{
    // Chrome, Firefox
    result = /.*\s(.+)/.exec((new Date()).toLocaleDateString(navigator.language, { timeZoneName:'short' }))[1];
}catch(e){
    // IE, some loss in accuracy due to guessing at the abbreviation
    // Note: This regex adds a grouping around the open paren as a
    //       workaround for an IE regex parser bug
    result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[\(])","g")).join('');
}
console.log(result);

Результат:

"CDT"

Ответ 6

Обновлено до 2015 года:

jsTimezoneDetect можно использовать вместе с момент-время, чтобы получить сокращение от часовой поясной стороны:

moment.tz(new Date(), jstz.determine().name()).format('z');  //"UTC"

Момент-часовой пояс не может сделать это сам по себе, поскольку его функция, которая использовалась для обработки, была обесценена, поскольку она не работала при любых обстоятельствах: https://github.com/moment/moment/issues/162, чтобы получить сокращение от часовой поясной стороны.

Ответ 7

Для поддержки crossbrowser рекомендуется использовать библиотеку YUI 3:

Y.DataType.Date.format(new Date(), {format:"%Z"});

Он поддерживает strftime идентификаторы.

Для получения дополнительной информации: http://yuilibrary.com/yui/docs/datatype/#dates

Ответ 8

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

new Date().toString().replace(/^.*GMT.*\(/, "").replace(/\)$/, "")

Ответ 9

Это сложный вопрос. Из того, что я собираю, часовой пояс не встроен как часть объекта Date при его создании. Вы также не можете установить часовой пояс для объекта Date. Однако есть временное смещение, которое вы можете получить из объекта Date, который определяется настройками пользовательской хост-системы (часового пояса). Подумайте о часовом поясе, чтобы определить смещение от UTC.

Чтобы облегчить жизнь, я настоятельно рекомендую moment и moment-timezone для обработки этих вещей. Moment создает объект-оболочку для Date с хорошим API для всех видов вещей.

Если существующий объект даты предоставляется вам через какой-либо параметр или что-то еще, вы можете передать его конструктору при создании моментального объекта, и вы готовы к работе. На этом этапе вы можете использовать moment-timezone, чтобы угадать имя часового пояса пользователя, а затем использовать форматирование момента и времени, чтобы получить аббревиатуру для часового пояса, Я бы рискнул сказать, что большинство пользователей имеют свой часовой пояс автоматически, но вы не должны полагаться на это для 100% точности. При необходимости вы также можете установить часовой пояс, который хотите использовать вручную, прежде чем тянуть нужный формат.

В целом при работе с датой и временем лучше хранить UTC в своей базе данных, а затем использовать момент js для форматирования времени для часовой пояс пользователя при его отображении. Могут быть случаи, когда вы должны быть уверены, что часовой пояс правильный. Например, если вы позволяете пользователю планировать что-то определенное время и время. Вам нужно будет абсолютно убедиться, что с пользователем западного побережья вы установите часовой пояс для PDT/PST перед тем, как перейти в UTC для хранения в своей базе данных.

Относительно сокращения временной зоны...
Вот базовый пример для сокращения аббревиатуры часового пояса с помощью момента и момента-времени.

// if all you need is the user timezone abbreviation you don't even need a date object.
const usersTimezoneName = moment.tz.guess()
const timezoneAbbr = moment().tz(usersTimezoneName).format('z')
console.log(timezoneAbbr) // PST (depending on where the user is)

// to manually set the timezone
const newYorkAbbr = moment(dateObj).tz('America/New_York').format('z')
console.log(newYorkAbbr) // EST

Для отображения определенного объекта даты с смещениями для определенного часового пояса вы можете это сделать.

const xmas = new Date('December 25, 2017 16:20:00')
const losAngelesXmas = moment(xmas).tz('America/Los_Angeles')
console.log(losAngelesXmas.format("dddd, MMMM Do YYYY, h:mm:ss a")) // Monday, December 25th 2017, 4:20:00 pm

Ответ 10

Попробуйте Google Closure Class goog.i18n.DateTimeSymbols и их классы, связанные с языком.

Ответ 11

Невозможно использовать ванильный JavaScript. Браузеры несовместимы в отношении возврата строк часового пояса. Некоторые возвращают смещения, такие как +0700, а другие возвращают PST.

Это непротиворечиво или надежно, поэтому вам нужна сторонняя script как moment.jsmoment-timezone.js) или создать собственную хэш-таблицу для преобразования между смещениями и сокращениями часового пояса.

Ответ 12

Ниже приведено самообновление, 12-часовое отображение даты/времени формата, которое не совсем отвечает на вопрос, однако оно может помочь другим, поскольку оно связано и основывается на Стивен Дюмонт и MDN. W3 Schools имеет очень полезный учебник, а обновления в режиме реального времени не требуют обновления страницы.

Все работы с новейшими версиями настольных FireFox, Chrome, Opera и Internet Explorer 11 работают. "2-значный" час появляется только для префикса нуля для одиночных значений в IE, однако минуты вернут двузначное значение надежно для всех браузеров. Тесты с прекращенной работой Windows Safari, хотя 12-часовой формат игнорируется, а секунды не скрыты.

Функция включает локальный часовой пояс, а также настраиваемые параметры для языков падения, отображение даты и даты и формат 12/24 часа. Дата и время были разделены, чтобы добавить разделительную строку "at". Установка только 'toLocaleTimeString' с опциями выбора также вернет дату и время. На страницы MDN можно ссылаться на параметры и значения.

<!--
function dateTimeClock() {
  var date = new Date();
  document.getElementById('timedate').innerHTML = date.toLocaleDateString(['en-us', 'en-GB'], {
      weekday: 'long',
      month: 'long',
      day: '2-digit',
      year: 'numeric'
    }) + ' at ' +
    date.toLocaleTimeString(['en-us', 'en-GB'], {
      hour12: 'true',
      hour: '2-digit',
      minute: '2-digit',
      timeZoneName: 'short'
    });
  var t = setTimeout(dateTimeClock, 500);
}

function start() {
  dateTimeClock();
}
window.onload = start;
//-->
<div id="timedate"></div>

Ответ 13

Я смог достичь этого только с моментом.

moment.tz(moment.tz.guess()).zoneAbbr() //IST

Ответ 14

try {
    result = /.*\s(.+)/.exec(date.toLocaleDateString(navigator.language, {timeZoneName:'short' }))[1];
} catch(e) {
    result = (new Date()).toTimeString().match(new RegExp("[A-Z](?!.*[\(])","g")).join('');
}

console.log(result);