Обнаружение сокращения часового пояса, используя JavaScript - PullRequest
38 голосов
/ 23 декабря 2009

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

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

Ответы [ 14 ]

50 голосов
/ 22 декабря 2015

Собственное решение:

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

16 голосов
/ 21 августа 2013

момент-часовой пояс включает недокументированный метод .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 г.)

Эван Чаплицкий (Evan Czaplicki) работал над проектом предложения по добавлению API часового пояса в браузеры .

16 голосов
/ 31 марта 2011

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

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

например

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

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

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

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

поздно отвечать, но я надеюсь, что это кому-нибудь пригодится

7 голосов
/ 23 декабря 2009

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

6 голосов
/ 02 августа 2016

Это прекрасно работает в Chrome, Firefox, но только в основном в IE11. В IE11 часовые пояса без прямых сокращений, таких как «Индийское время чагос», будут возвращать «ИКТ» вместо правильного «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"
2 голосов
/ 30 июля 2015

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

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

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

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

1 голос
/ 11 марта 2017

Это сложная тема. Из того, что я понял, часовой пояс не встроен как часть объекта 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's 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
1 голос
/ 06 января 2017

Мне удалось достичь этого только с одного момента.

moment.tz(moment.tz.guess()).zoneAbbr() //IST
1 голос
/ 24 сентября 2012

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

new Date().toString().replace(/^.*GMT.*\(/, "").replace(/\)$/, "")
1 голос
/ 16 марта 2012

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

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

Поддерживаются идентификаторы strftime .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...