date-fns возвращает неверную дату в сафари - PullRequest
0 голосов
/ 12 апреля 2019

Я использую date-fns, чтобы вернуть некоторые значения, как показано ниже:

import { format, formatDistance } from "date-fns";

var date = new Date("2019-03-06 00:00:00");
console.log(format(new Date(date), "dd MMM, y"));

Отлично работает на Chrome и возвращает We Mar, y

Но возвращает Invalid Date в Safari.

Я полагаю, это потому, что дата ("2019-03-06 00:00:00") не в формате ISO 8601. Но это формат, который я получаю от конечной точки. Есть ли возможность преобразовать это в правильный формат и заставить его работать в Safari?

1 Ответ

1 голос
/ 12 апреля 2019

Я вижу две проблемы:

  1. Вы полагаетесь на нестандартный формат ввода при первом анализе даты.

  2. ВыВы передаете 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 будут обновлены, чтобы использовать ее, если она будет достаточно быстрой.

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