Почему JavaScript Date.getTimezoneOffset() рассматривает "-05: 00" как положительное смещение?
Я заметил, что для нас в восточном часовом поясе ( "Америка/Новый_York" ) со смещением часового пояса "- 05:00" Date.getTimezoneOffset() возвращает положительный число 300. Я ожидал бы, что смещение в минутах будет отрицательным в районах на западе от Utc и будет положительным в областях к востоку от Utc, но, по-видимому, это "flippded". Каковы причины этого решения?
http://momentjs.com/ следует тому же правилу и возвращает...
moment.parseZone("01/13/2014 3:38:00 PM +01:00").zone() // == -60
moment.parseZone("01/13/2014 3:38:00 PM -01:00").zone() // == 60
В то же время DateTimePicker http://trentrichardson.com/examples/timepicker/ не переворачивает номера при настройке своего первоначального параметра "временной зоны". Это неправильно?
Ответы
Ответ 1
Потому что так оно и было определено. Цитирование документа ( MDN):
Смещение временной зоны - это разница в минутах между UTC и местное время. Обратите внимание, что это означает, что смещение положительно, если локальный часовой пояс находится за UTC и отрицательный, если он впереди.
Ответ 2
Разрабатывая немного на raina77ow вполне приемлемый ответ...
Во-первых, поймите, что основными стандартами здесь являются ISO 8601 и RFC 822 (и его родственники 733, 1123 и 2822), которые были (частично) получены из ANSI X3.51- 1975.
Все эти стандарты используют соглашение о положительных значениях, которое находится к востоку от UTC/GMT, а отрицательные значения - к западу от UTC/GMT.
Единственный стандарт, который я знаю об этом, - это POSIX (см. раздел POSIX wiki темы часового пояса и в этой статье), и поэтому объясняет, почему обратная совместимость часовых поясов Олсона, таких как "Etc/GMT + 5", инвертирована. (Конечно, возможно, есть и другие способы использования, и я просто не знаю о них.)
Верьте или нет, JavaScript делает это ОБОИХ способов. При использовании в качестве строки (в синтаксисе RFC 822 или ISO 8601) он использует часы и минуты с положительными смещениями к востоку от UTC. Но при вызове метода getTimezoneOffset()
объекта Date
он возвращает целые минуты, которые являются положительными к западу от UTC.
Можно только догадываться, почему эта несогласованность существует. спецификация ECMAScript полна таких проблем. Возможно, потому, что, когда вы видите смещение в строке ISO 8601 или RFC 822, это смещение уже применяется. Но когда вы вызываете getTimezoneOffset()
, это смещение применяется, чтобы вернуть его в UTC.
Например, 2014-01-01T00:00:00-05:00
равно 2014-01-01T05:00:00Z
. Поэтому getTimezoneOffset()
вернет 300
. Если вы добавите 300 минут к исходному значению, вы вернетесь в UTC.
Это две стороны той же монеты. См?
Что касается того, является ли этот конкретный контроль неправильным, я не уверен. Я не знаком с этим конкретным контролем. Я вижу в своих документах пример -0400, равный -240, который можно было бы отменить, но опять-таки немного странно, чтобы он представлял пользователю значение -240. Действительно, вы не должны выставлять смещения пользователю в любом случае (IMHO). Вам гораздо лучше использовать элемент управления часовым поясом, например этот или этот.