Javascript Date Object предоставляет разные часовые пояса для по-разному форматированных строк даты - PullRequest
0 голосов
/ 31 августа 2018

Кто-нибудь знает, почему объект Date в Javascript изменяет часовой пояс в зависимости от того, как отформатирована ваша строка, и если есть способ избежать этого?

Например, на западном побережье (Firefox почему-то использует PST, Chrome использует PDT),

new Date("08/30/2018") -> Date 2018-08-30T08:00:00.000Z

, а

new Date("2018-08-30") -> Date 2018-08-30T00:00:00.000Z

Мне потребовалось некоторое время для устранения этой проблемы, и я бы предпочел не добавлять дополнительный код, если это возможно, для изменения часового пояса или переформатирования входной строки.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Если вы посмотрите документы для даты на Mozilla

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Примечание: разбор строк даты с помощью конструктора Date (и Date.parse, они эквивалентны) настоятельно не рекомендуется из-за Браузерные различия и несоответствия. Поддержка формата RFC 2822 Строки только по соглашению. Поддержка форматов ISO 8601 отличается что строки только с датой (например, «1970-01-01») обрабатываются как UTC, а не местные.

Я бы рекомендовал использовать https://momentjs.com/ или даже https://moment.github.io/luxon/ для разбора даты с использованием комбинации datestring + format

moment("12-25-1995", "MM-DD-YYYY");
0 голосов
/ 31 августа 2018

У меня нет ответа от спецификации, но я могу догадаться. @charlietfl находится на правильном пути - 08/30/2018 - это специфический для США (или иначе «локальный») формат - он не признан на международном уровне, и, в частности, большинство европейских стран обращают порядок дня и месяца в обратном порядке. Таким образом, если вы переводите время в локальный формат, это предполагает, что вы не знаете ничего лучше, и просто устанавливает часовой пояс на любой системный часовой пояс в браузере.

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

Я рекомендую, если важен часовой пояс, указывать его при инициализации объекта (даже если вы хотите UTC), потому что всегда лучше уменьшить неоднозначность. В частности, в этом случае ваш браузер использует тихоокеанское время, потому что, по-видимому, вы находитесь на Западном побережье. Мой использует восточный, потому что я на восточном побережье, поэтому временная метка отличается для первого случая - она ​​использует мое местное время. Международно признанный формат даты - UTC для нас обоих.

EDIT:

Я не был удовлетворен догадками. Согласно документам , Date() использует метод Date.parse() для анализа строки и распознавания, какая дата требуется - якобы она соответствует спецификациям здесь и здесь - здесь они оказываются лишь минимально полезными, не тратя больше времени, чем я желаю.

Документация для Date.parse() указывает, что она принимает входное значение и возвращает миллисекунды с начала эпохи.

Вот соответствующий бит для вас от Date.parse():

Учитывая строку даты "7 марта 2014", parse () предполагает местный часовой пояс, но учитывая формат ISO, такой как "2014-03-07", он будет принимать часовой пояс UTC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...