Як я можу отримати ім'я часового поясу в JavaScript?


117

Я знаю, як компенсувати часовий пояс, але мені потрібна можливість виявити щось на кшталт "Америка / Нью-Йорк". Це можливо навіть із JavaScript або це те, що я маю зробити, щоб оцінити, виходячи зі зміщення?


2
Ось функція, яку написав Джон Ніландер, можливо, це допомагає bitbucket.org/pellepim/jstimezonedetect
yunzen

Ось відповідна відповідь, яка може допомогти: stackoverflow.com/a/19421672/1447034
Дуглас

Відповіді:


241

В API Інтернаціоналізація підтримує отримання часового поясу користувача, і підтримуються в усіх сучасних браузерах.

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

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


6
Ніколи не думав, що це так просто
Мохаммед Шаріф C

5
дивовижний, перший я побачив, який не використовує момент! Дякую
r0bb077

3
Дивовижне рішення. Не хотів для цього включити весь плагін часового поясу.
Джоан Гіл

1
дуже просте і приємне рішення!
blackiii

2
@DanielCompton о, я не знав про цю таблицю, дякую, що виправив її ще раз.
CommonSenseCode

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 (наприклад 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();

9
Зауважте, що це також просто можливо без будь-яких залежностей:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322

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
Не особливо корисно через кілька часових поясів, що мають однаковий зсув
bmerigan

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.