Я вижу две проблемы:
Вы полагаетесь на нестандартный формат ввода при первом анализе даты.
Вы передаете 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 будет обновлена, чтобы использовать это, если оно будет достаточно быстрым.
person
T.J. Crowder
schedule
12.04.2019
"2019-03-06 00:00:00".split(" ").join("T")
- person epascarello   schedule 12.04.2019