Я вижу две проблемы:
Вы полагаетесь на нестандартный формат ввода при первом анализе даты.
ВыВы передаете Date
в конструктор Date
, что заставляет его преобразовывать дату в строку, а затем анализирует строку.
Я бы проанализировал его только один раз,и используйте стандартный формат даты / времени при первом вызове new Date
:
import { format, formatDistance } from "date-fns";
var date = new Date("2019-03-06T00:00:00");
// Note -----------------------^
console.log(format(date, "dd MMM, y"));
// No `new Date` ^
Обратите внимание, что ваша строка будет проанализирована как местное время (включеносовместимые со спецификацией механизмы JavaScript¹), поскольку они включают в себя временную часть строки.К сожалению, это изменилось после того, как формат был добавлен в ES2015, обновлен в ES2016, но где он заканчивается:
Когда представление смещения UTC отсутствует, формы только по дате интерпретируются как время UTC иформы даты и времени интерпретируются как местное время.
Поскольку ваша строка не имеет смещения UTC (нет Z
или +00:00
или аналогичного) и имеет время, онаразобрали по местному времени.(Опять же, на спецификации JavaScript-движков¹).
Моя рекомендация: не анализировать строки даты со встроенным объектом Date
или убедиться, что в строке всегда есть индикатор часового пояса, есливы делаете.
¹ RobG указал, что Safari анализирует new Date("2019-03-06T00:00:00")
как UTC.К сожалению, это ошибка в JavaScriptCore, движке JavaScript от Apple.Он влияет не только на Safari, но и на Chrome на iOS (и, возможно, на любой другой браузер iOS; я тестировал Brave, Opera и Dolphin), поскольку Chrome должен использовать JavaScriptCore вместо своего обычного V8 на iOS, потому что приложения не могутвыделите исполняемую память, чтобы JIT-движки не могли использоваться на iOS.Но команда V8 сделала версию только для интерпретатора V8 , поэтому, возможно, Chrome (и Brave) на iOS будут обновлены, чтобы использовать ее, если она будет достаточно быстрой.