Сравнить даты с Rails с JavaScript - PullRequest
2 голосов
/ 04 августа 2020

Я работаю над функцией проекта, которая изменяет цвет элемента в зависимости от даты создания записи. Я использую Rails Backend и React Frontend. Я пытаюсь убедиться, что цвет соответствует подходящему дню, а не дню до или после.

В Rails у меня есть запись, где атрибут created_at равен "2020-07-29 17:38:00.437423" (PST)

В React эта же запись показывает свой атрибут created_at как "2020-07-29T17:38:00.437Z"

1.

new Date("2020-07-29 17:38:00.437423")
//=> Wed Jul 29 2020 17:38:00 GMT-0700 (Pacific Daylight Time)
new Date("2020-07-29T17:38:00.437Z")
//=> Wed Jul 29 2020 10:38:00 GMT-0700 (Pacific Daylight Time)

Я заметил, что когда я удаляю букву «Z» во второй версии, время совпадает, как я ожидал, но почему эти строки возвращают объекты даты, которые показывают разница в 7 часов?

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

В браузере, когда вы создаете дату без какой-либо информации о часовом поясе, он фактически предполагает, что он находится в системном часовом поясе:

new Date("2020-07-29 17:38:00.437423")
> Date Wed Jul 29 2020 17:38:00 GMT+0200 (Central European Summer Time)

В моем случае это GMT+0200, потому что я нахожусь в Дании. Упс.

2020-07-29T17:38:00.437Z на самом деле метка времени ISO8601 с обозначением часового пояса, которое намного менее двусмысленно.

Если время указано в UT C, добавьте Z сразу после времени без пробела. Z - обозначение зоны для нулевого смещения UT C. «09:30 UT C» поэтому представляется как «09: 30Z» или «0930Z». «14:45:15 UT C» будет «14: 45: 15Z» или «144515Z». ISO8601 - Википедия

JavaScript обработка дат и времени заведомо плохая. Когда Брендан Эйх поспешил создать язык за 10 дней назад, во время войны браузеров, он просто сорвал объекты даты и времени из java, а поставщики браузеров создали разные (ужасные) реализации. Результатом является беспорядок, который все еще преследует нас 25 лет спустя.

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

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>

Я бы действительно порекомендовал отличную статью Thoughtbot It's About Time (Zones) для внутренней стороны вещей.

1 голос
/ 04 августа 2020

макс ответ правильный. Я просто хотел пояснить, что Javascript может анализировать временные метки ISO8601 со смещением UT C, он просто забыл «0».

new Date("2020-07-29T17:38:00.437-07:00")
2020-07-30T00:38:00.437Z

Вот спецификация для справки: https://tc39.es/ecma262/#sec -date-time-string-format

Я бы просто прокомментировал его ответ, но у меня нет репутации.

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