Параметр Chrome timeZone для Date.toLocaleString()

Недавно я обнаружил, что есть новое расширение JavaScript. Это добавляет несколько функций объекту Date в функциях toLocaleString, toLocaleDateString и toLocaleTimeString. Ссылка здесь.

Меня особенно интересует опция timeZone, которая поддерживает часовые пояса IANA/Olson, такие как America/New_York или Europe/London. В настоящее время это поддерживается только в Google Chrome.

Предыдущий совет заключался в том, что для работы в JavaScript с любым другим часовым поясом, кроме UTC или вашего собственного локального часового пояса, нужно использовать библиотеку. Но теперь кажется, что это начинает включаться непосредственно в браузер. Теперь вы можете сделать это:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

// output: "7/4/2013 5:15:45 PM"

Или:

new Date().toLocaleString("en-NZ", {timeZone: "Pacific/Chatham",
                                    timeZoneName: "long"})

// output:  "7/5/2013 9:59:52 AM GMT+12:45"

Или:

new Date().toLocaleString("en-GB", {timeZone: "Europe/London",
                                    timeZoneName: "short"})

// output:  "4/7/2013 22:18:57 United Kingdom Time"
// (strange time zone name, but ok)

Это очень здорово, но у меня есть несколько вопросов:

  • Является ли эта часть нового стандарта? Возможно, похоронили где-то в ECMAScript 6? Или это просто что-то обычное для Chrome?
  • Почему именно Google Chrome? Поддерживается ли она где-нибудь еще? Есть ли планы поддержать его где-нибудь еще?
  • Я проверил node.js, который использует время выполнения JavaScript JavaScript, но он там не работает. Почему бы и нет?
  • Доступны ли данные часового пояса любым другим способом, чем перечисленные мной функции? Если доступно только при форматировании строк, выполнение любых вычислений на основе результатов может быть затруднено.
  • Это сфокусировано на выходе, но как я буду использовать его для ввода? Есть ли способ передать часовой пояс в конструкторе объекту Date? Я попробовал следующее:

    // parsing it with a date and time
    new Date("2013-01-01 12:34:56 America/New_York")
    
    // passing it as a named option
    new Date(2013,0,1,12,34,56,{timeZone:"America/New_York"})
    

    Ни один из них не работал. Я не мог найти ничего в спецификациях, поэтому я не думаю, что это существует (пока), но, пожалуйста, скажите мне, не ошибаюсь.

  • Проблема, описанная в этом сообщении, созданная недостатком спецификации ECMAScript 5, по-прежнему влияет на выход, даже если правильные данные находятся в TZDB. Как сосуществуют как старые, так и новые реализации? Казалось бы, все будет по-старому, или по-новому. Например, с моим часовым поясом компьютера, установленным в Восточное время США:

    new Date(2004,10,7,0,0).toLocaleString("en-US",{timeZone:"America/New_York"})
    

    возвращает "11/6/2004 11:00:00 PM". Он должен вернуться в полночь, так как я начал в полночь, и мой локальный часовой пояс соответствует выходному часовому поясу. Но он помещает предоставленную дату ввода в неправильную точку UTC из-за проблемы ES5.

  • Можно ли ожидать, что по мере того, как IANA выпускает обновления TZDB, Google будет использовать обновления Chrome, содержащие изменения?

Ответ 1

Обновление

Существует довольно обширная запись об API здесь


Является ли эта часть нового стандарта? Возможно, захоронен где-то в ECMAScript 6? Или это что-то обычное для Chrome?

Да, это часть API интернационализации ECMAScript. Он реализуется отдельно от ECMAScript, но требование внедрения API интернационализации ECMAScript состоит в том, чтобы сначала иметь правильную реализацию ECMAScript 5.1

Почему именно Google Chrome? Поддерживается ли она где-нибудь еще? Есть ли планы поддерживать его где-нибудь еще?

В последние годы Google Chrome в основном был первым, кто реализовал новые функции. Mozilla более консервативен, но, например, обсуждает, следует ли реализовать атрибут download элементов a. Теперь он доступен в IE11 Beta и Opera. Он будет доступен в Firefox 25.

Я проверил node.js, который использует время выполнения JavaScript JavaScript, но он там не работает. Почему бы и нет?

node.js просто использует тот же движок, который отдельный проект из браузера Google Chrome. Двигатель просто реализует Ecmascript 5.1. Это расширение node.js необходимо было бы реализовать отдельно прямо сейчас. Он станет доступен в V8 в Q3, поэтому, возможно, немного после этого вы можете использовать его в node.js.

Это сфокусировано на выходе, но как я буду использовать его для ввода? Здесь способ передать часовой пояс в конструкторе объекту Date? я попробовал следующее:

Нет ничего о вводе дат в спецификации. Я лично не вижу, как это было бы полезно, вы делаете это неправильно, если не передаете отметки времени UTC, потому что что-то вроде "2013-01-01 12:34:56 America/New_York" неоднозначно во время переходов с DST на стандартное время.

Проблема, описанная в этом сообщении, созданная изъяном в ECMAScript 5, все еще влияет на выход, даже если правильные данные находятся в TZDB.

Это проблема ввода, а не выход. Опять же, создание даты с локальным часовым поясом, на которое вы не можете повлиять или обнаружить, делает это неправильно. Используйте перегрузку конструктора timestamp или Date.UTC.

Можно ли ожидать, что по мере того, как IANA выпускает обновления TZDB, Google будут содержать обновления Chrome, содержащие изменения?

Ничего в спецификации, но я думаю, будет разумно ожидать, что правила не слишком сильно отстают.

Ответ 2

Является ли эта часть нового стандарта? Возможно, захоронен где-то в ECMAScript 6? Или это что-то обычное для Chrome?

Действительно, это часть нового стандарта ECMA-402. Стандарт очень трудно читать, но есть это дружественное введение.

Почему именно Google Chrome? Поддерживается ли она где-нибудь еще? Есть ли планы поддерживать его где-нибудь еще?

В MDN есть список поддерживающих браузеров. В соответствии с Ошибка 853301 он будет доступен в Firefox 25.

Я проверил node.js, который использует время выполнения JavaScript JavaScript, но он там не работает. Почему бы и нет?

Возможными причинами являются многие; это не до текущей базы кода, или это сделало бы node.js больше и медленнее (предыдущая запись трекера от Mozilla указывает, что данные часового пояса увеличили размер загрузки Firefox на 10% и вызвали I/O, чтобы существенно увеличиться при запуске браузера.

Доступны ли данные часового пояса любым другим способом, чем перечисленные мной функции? Если только доступны при форматировании строк, а затем любые вычисления, основанные на результатах, могут быть трудно.

Кажется, он недоступен. Кроме того, в руководстве Intl API говорится, что требуется поддержка только UTC и локального часового пояса.

Это сфокусировано на выходе, но как я буду использовать его для ввода? Есть ли способ пройти часовой пояс в конструкторе для объекта Date? Я попробовал следующее:

Intl API говорит только о форматировании даты и времени, строковых сопоставлениях и форматировании чисел. Форматирование даты и времени не только поддерживает григорианский календарь, но и множество других календарей, лунных, лунисолярных и т.д.

Проблема, описанная в этом сообщении, созданная из-за ошибки в спецификации ECMAScript 5, все еще затрагивает выход, даже если правильные данные находятся в TZDB. Как получается, что как старые, так и новые реализации сосуществуют? Можно было бы подумать, что все будет по-старому, или все новые путь. Например, с моим часовым поясом компьютера, установленным в Восточное время США:

new Дата (2004,10,7,0,0).toLocaleString( "en-US", {timeZone: "America/New_York" })

возвращает "11/6/2004 11:00:00". Он должен вернуться в полночь, так как я начал в полночь и > мой локальный часовой пояс соответствует выходному часовому поясу. Но он помещает предоставленную дату ввода в > неправильную точку UTC из-за проблемы ES5.

Причиной этого является то, что ES5 требует, чтобы ввод в новую дату был рассчитан с использованием текущего DST и смещения, то есть это Америка/Нью-Йорк, но с часовым поясом EDT, хотя 6 ноября не находится в EDT. Очевидно, что, поскольку это так указано, оно не может быть изменено. Тем не менее, поскольку Chrome использует TZDB для преобразования с минимального значения времени по времени UTC в Америку/Нью-Йорк tz, тогда он учитывает время как находящееся в EST.

Можно ли ожидать, что по мере того, как IANA выпускает обновления TZDB, Google будет использовать обновления Chrome которые содержат изменения?

Я бы так поверил