
Новый Intl.DurationFormat привел к неожиданной ошибке приложения
VolhaIvanova 1 час назад Новый Intl.DurationFormat привел к неожиданной ошибке приложения Средний 3 мин 2.1K JavaScript * ReactJS * Кейс Из песочницы Если вы уже используете новый Intl.DurationFormat в совсем проекте,...
Значимый прорыв формирует отрасль ИИ: VolhaIvanova 1 час назад Новый Intl. DurationFormat привел к неожиданной ошибке приложения Средний 3 мин 2. 1K JavaScript * ReactJS * Кейс Из песочницы Если вы уже используете новый Intl.
DurationFormat в совсем проекте, то вам будет полезен мой кейс и поможет вам сэкономить пару часов на дебагинг. Продукт над которым я работаю - это платежная форма. Это стабильное давно работающее приложение и вдруг пользователи стали сообщать об «Unknown error» при попытке провести транзакцию.
Технические детали
При этом проблема была только для одного вида транзакций — «Счет». Сначала проверили бэкенд, там все запросы проходят корректно, я стала проверять фронт и к моему удивлению никаких особенностей для этого типа транзакций добавлено не было и в кодовой базе она ничем не отличалась от обработки других транзакций. Если коротко, платежная форма состоит из инпутов, таймера обратного отсчета и кнопок.
Соответственно, подозрения пали на работу таймера в первую очередь. После сравнения данных транзакции для успешных и выдающих ошибку, паттерн обнаружился в данных бэкенда: { "transaction": { "id": 111111111, "status": "Pending", "createdAt": "2026-05-11T08:39:15+00:00", "expiresAt": "2026-07-01T08:39:15+00:00" } } expiresAt — июль, а сейчас май. Так, срок жизни транзакции типа «Счет» ~55 дней, в то время как все другие транзакции живут не больше 15 минут.
Дело в том, что банковские переводы ждут подтверждения от банка и могут висеть несколько дней. Именно поэтому баг проявлялся только для этого типа — остальные работали корректно. У нас в проекте для таймера обратного отсчёта используется компонент TextTimer с полифиллом formatjs/intl-durationformat@ 0.
Отраслевые последствия
Полифилл подключён в корне приложения глобально, поэтому нативная реализация браузера не задействована. Код до фикса: const formatter = new Intl. locale, { hoursDisplay: "auto", secondsDisplay: "always", style: formatStyle, }); function getDiff(unit: dayjs.
OpUnitType) { let diff = expiresAtDayjs. diff(now, unit); if (unit === "m" unit === " return Math. max(0, diff); } formatter.
format({ hours: getDiff("h // = 1320 minutes: getDiff("m seconds: getDiff("s }); // 💥 RangeError Так в чем же проблема? Дело в том, что если в таймер приходит длительность больше суток, а в моем случае это было 55 дней, getDiff(“h”) возвращает 1320 — потому что для часов не было % 24, и days не передавался в . Полифилл видел 1320 часов, Intl.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





