2016-03-09 2 views
0

Я хочу рассчитать смещение от «пользовательского времени» до «WET/WEST».получить смещение временной зоны другого часового пояса в javascript без использования строк

Я получаю пользователей с новыми Date().getTimezoneOffset().

Но как я могу получить смещение для WET/WEST Итак, я могу вычислить комбинированное смещение обоих?

Например, если пользователь находится в центральном европе (CET/CEST), зимой комбинированное смещение будет -60 (CET) + 0 (WET) = -60. Летом это будет -120 (CEST) + 60 (WEST) = -60. В этом случае это всегда -60, но пользователь может также иметь часовой пояс без DST.

Возможно ли это без форматирования строки и считывания нового часового пояса из этой строки?

+0

Поскольку объекты Date являются UTC в центре, вы можете игнорировать местный часовой пояс и применять только любое смещение, которое вам нравится к частям UTC, а затем читать новые значения UTC. Вы не можете надежно прочитать часовой пояс из результата 'Date.prototype.toString', поскольку он зависит от реализации. Часовой пояс может отсутствовать, двусмыслен или неразличим. – RobG

+0

Но где я могу получить смещение для WET? Я ищу что-то вроде нового Timezone («WET»). GetOffset – Jens

+1

Для этого вам нужно будет создать свою собственную утилиту, возможно, на основе [* IANA базы данных часовых поясов *] (https://www.iana.org/ временные зоны), который широко используется. Я не вижу необходимости в конструкторе, timezones - простые вещи со смещением от UTC, поэтому 'myDateLib.getTimezoneOffset ('WET')' или 'myDateLib.getTimezoneOffset ('LHDT')' или 'myDateLib.getTimezoneOffset (' Австралия/Lord_Howe ') '. – RobG

ответ

2

Вы не можете надежно использовать аббревиатуры часового пояса для ввода, поскольку их можно интерпретировать по-разному. Например, CST может быть либо «Центральное стандартное время» в Северной Америке, либо «Китайское стандартное время», или «Стандартное время Кубы». Хотя некоторые аббревиатуры, такие как WET и WEST, уникальны, многие из них неоднозначны. См. the list of time zone abbreviations here.

Вместо этого вам необходимо знать идентификатор часового пояса IANA. Одно место that uses WET/WEST - Португалия, которая как идентификатор IANA "Europe/Lisbon". Вы можете найти список идентификаторов here. Выбор правильного идентификатора важен, так как часовые пояса меняются со временем. Каждый идентификатор отражает конкретную историю каждого региона.

Один вы знаете идентификатор часового пояса IANA, то у вас есть варианты, как использовать его:

  1. В некоторых современных браузерах, которые полностью поддерживают функции часового пояса на ECMAScript Internationalization API (ECMA-402), вы можете сделать следующее :

    var d = new Date(); 
    var s = d.toLocaleString(undefined, { timeZone: "Europe/Lisbon" }) 
    

    Это будет преобразовывать предоставленные даты и время в нужный часовой пояс во время форматирования. Передача undefined в первом параметре будет использовать текущий язык для форматирования.

    Существует несколько недостатков этого подхода, поскольку он еще не реализован во всех браузерах, и нет API для простого извлечения необработанного смещения часового пояса определенного момента времени.

  2. Вы можете использовать библиотеку, которая реализует эту функциональность. I list several of them here. Мое личное предпочтение для moment.js с moment-timezone аддоном, который вы можете сделать следующее:

    var m = moment.tz("Europe/Lisbon"); 
    var s = m.format(); 
    

    Вы можете передать параметры методу format для вывода изображения, как вам нравится. Вы можете также преобразовать существующее время, например:

    var m = moment.utc("2016-01-01T00:00:00").tz("Europe/Lisbon"); 
    var s = m.format(); 
    

    Вы также можете получить смещение на определенный момент времени, например, так:

    var m = moment.utc("2016-01-01T00:00:00").tz("Europe/Lisbon"); 
    var offsetInMinutes = m.utcOffset(); 
    var offsetAsString = m.format("Z"); 
    
  3. Вы можете написать свой собственный код для обработки; конкретный часовой пояс. Хотя это может быть подвержено ошибкам, и я вообще не рекомендую его. Обновления могут быть особенно сложными, если вы спуститесь по этому маршруту.

Также имейте в виду, что смещение для определенного часового пояса будет зависеть от даты и времени. Следовательно, new Date(), который представляет «сейчас», может или не всегда может быть правильным вводом, в зависимости от вашего сценария.

Смежные вопросы