Как я могу получить название часового пояса в JavaScript?


118

Я знаю, как получить смещение часового пояса, но мне нужна возможность определять что-то вроде «Америка / Нью-Йорк». Возможно ли это даже из JavaScript, или это то, что мне нужно будет предположить на основе смещения?


2
Вот функция, которую написал Джон Ниландер, возможно, она поможет bitbucket.org/pellepim/jstimezonedetect
юнзен,

Вот связанный ответ, который может помочь: stackoverflow.com/a/19421672/1447034
Дуглас

Ответы:


245

В API Интернационализация поддерживает получение часового пояса пользователя, и поддерживаются во всех современных браузерах.

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

Имейте в виду, что в некоторых старых версиях браузеров, поддерживающих API интернационализации, для timeZoneсвойства установлено значение, undefinedа не строка часового пояса пользователя. Насколько я могу судить, на момент написания (июль 2017 г.) все текущие браузеры, кроме IE11, будут возвращать часовой пояс пользователя в виде строки.


6
Никогда не думал, что это так просто
Мохаммед Шариф C

5
потрясающе, первая из тех, что я видел, не использует момент! Спасибо
r0bb077

3
Отличное решение. Не хотел включать для этого плагин полного временного часового пояса.
Joan Gil

1
очень простое и красивое решение!
blackiii

2
@DanielCompton о, я не знал об этой таблице, спасибо, что снова исправили.
CommonSenseCode 03

9

Ответ, получивший наибольшее количество голосов, вероятно, является лучшим способом получить часовой пояс, однако Intl.DateTimeFormat().resolvedOptions().timeZoneвозвращает имя часового пояса IANA по определению, которое находится на английском языке.

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

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

Проверено в Chrome и Firefox.

Конечно, в некоторых средах это не будет работать должным образом. Например, node.js возвращает смещение по Гринвичу (например GMT+07:00) вместо имени. Но я думаю, что это все еще можно прочитать как запасной вариант.

PS Не будет работать в IE11, как и Intl...решение.


6

Вы можете использовать этот скрипт. http://pellepim.bitbucket.org/jstz/

Репозиторий форк или клонов здесь. https://bitbucket.org/pellepim/jstimezonedetect

После того, как вы включите скрипт, вы можете получить список часовых поясов в jstz.olson.timezonesпеременной.

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

var tz = jstz.determine();
tz.name();

Наслаждайтесь jstz!


3

Получить часовой пояс по названию (например, "Америка / Нью-Йорк")

moment.tz.guess();

11
Пожалуйста, Intl.DateTimeFormat().resolvedOptions().timeZone
отметьте

1
Да, хотя moment-js также предполагает TZ для «браузеров», которые не поддерживают эту функцию. :)
Ферран Майлинч

в IE11 Intl.DateTimeFormat().resolvedOptions().timeZoneвозвращает undefined, но moment.tz.guess()возвращает правильное значение
Antoni4

0

Вы можете просто написать свой собственный код, используя таблицу сопоставления здесь: http://www.timeanddate.com/time/zones/

или используйте библиотеку моментных часовых поясов: http://momentjs.com/timezone/docs/

Видеть zone.name; // America/Los_Angeles

или эта библиотека: https://github.com/Canop/tzdetect.js


4
Не особенно полезно из-за того, что несколько часовых
поясов

0

Это получает код часового пояса (например, GMT) в более старом javascript (я использую скрипт приложения Google со старым движком):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

Я просто кладу это сюда на случай, если кому-то это понадобится.


1
Я думаю, что это работает только для UTC/ GMT. Похоже, что другие прописаны; например, Pacific Daylight Time.
Ян Данн,

-1

Попробуйте этот код, обратитесь отсюда

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>

-5

В javascript метод Date.getTimezoneOffset () возвращает смещение часового пояса от UTC в минутах для текущей локали.

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Moment'timezone будет полезным инструментом. http://momentjs.com/timezone/

Преобразование дат между часовыми поясами

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

4
Вы не поняли очередь.
srsajid

3
Примеры вашего кода не связаны с исходным вопросом. Как бы вы использовали эту библиотеку, чтобы вернуть имя текущего часового пояса пользователя?
Джо Уайт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.