В браузере, когда вы создаете дату без какой-либо информации о часовом поясе, он фактически предполагает, что он находится в системном часовом поясе:
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) для внутренней стороны вещей.