Подтвердить что ты не робот

Почему 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/ не переворачивает номера при настройке своего первоначального параметра "временной зоны". Это неправильно?

4b9b3361

Ответ 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). Вам гораздо лучше использовать элемент управления часовым поясом, например этот или этот.