С React Native можно очень легко начать, а потом в какой-то момент возникают проблемы, и нам нужно погрузиться в него глубже.

На днях у нас была странная ошибка, которая возникала только в производственной сборке и только в iOS. Длинная обратная трассировка в приложении показала, что это произошло из-за сбоя конструктора Date.

const date = new Date("2019-01-18 12:00:00")

Это возвращает правильный объект Date в режиме отладки, но дает Invalid Date в выпуске. Что особенного в конструкторе Date? Здесь я использую React Native 0.57.5 и не использую библиотеки Date.

Конструктор даты

Лучший ресурс для изучения Javascript — веб-документы Mozilla и ввод Дата:

Создает экземпляр JavaScript Date, представляющий отдельный момент времени. Объекты даты используют Отметку времени Unix, целочисленное значение, которое представляет собой количество миллисекунд с 1 января 1970 года по всемирному координированному времени.

Обратите внимание на то, как Date может быть построена с помощью dateString:

значение dateStringString, представляющее дату. Строка должна быть в формате, распознаваемом методом Date.parse() (метки времени RFC 2822, соответствующие IETF, а также версия ISO8601).

Итак, конструктор Date использует статический метод Date.parse под капотом. У этого есть очень специфические требования к формату строки даты, которую он поддерживает.

Стандартное строковое представление строки даты и времени является упрощением расширенного формата даты календаря ISO 8601 (дополнительные сведения см. в разделе Формат строки даты и времени в спецификации ECMAScript). Например, 2011–10–10 (форма только для даты), 2011–10–10T14:48:00 (форма для даты и времени) или 2011–10–10T14:48:00.000+09:00. ” (форма даты и времени с миллисекундами и часовым поясом) может быть передана и будет проанализирована. Когда смещение часового пояса отсутствует, формы только для даты интерпретируются как время UTC, а формы даты и времени интерпретируются как местное время.
Спецификация ECMAScript гласит: если строка не соответствует стандартному формату, функция может вернуться к любой специфичной для реализации эвристике или алгоритму синтаксического анализа для конкретной реализации. Нераспознаваемые строки или даты, содержащие недопустимые значения элементов в строках в формате ISO, должны привести к тому, что Date.parse() вернет NaN.

Причина, по которой мы получаем неверную дату в iOS, должна заключаться в том, что код запускался в двух разных средах JavaScript, и они каким-то образом различаются…