Работа с датами в JavaScript неизбежно упирается в проблему временных
зон, поскольку встроенный объект Date оперирует
UTC-ориентированным внутренним представлением и локальной зоной
окружения, не предоставляя полноценного API для корректного управления
IANA time zone идентификаторами (например,
Europe/Amsterdam, Asia/Almaty). Библиотека
date-fns-tz расширяет функциональность date-fns, добавляя инструменты
для преобразования времени между зонами, форматирования с учётом
часового пояса и конвертации локального времени в UTC и обратно.
date-fns строится как набор чистых функций, работающих с объектом
Date, не изменяя его прототип. date-fns-tz следует той же
философии: вместо расширения Date добавляются
функции-обёртки, принимающие дату, строку временной зоны и возвращающие
новый результат.
Ключевой принцип интеграции:
date-fns — работа с календарной логикой (дни, месяцы,
интервалы)date-fns-tz — работа с географическими временными
зонамиТакая разделённость позволяет избежать смешивания доменной логики дат и системных ограничений времени.
Базовая установка предполагает одновременное использование обеих библиотек:
npm install date-fns date-fns-tz
Импорт функций выполняется точечно:
import { format, addDays } from "date-fns";
import { formatInTimeZone, zonedTimeToUtc, utcToZonedTime } from "date-fns-tz";
Подход с именованными импортами снижает размер бандла и поддерживает tree-shaking.
date-fns-tz опирается на IANA Time Zone Database. В отличие от
фиксированных смещений (+06:00), IANA зоны учитывают:
Пример идентификаторов:
Europe/MoscowAsia/AlmatyAmerica/New_YorkФункция utcToZonedTime (или в новых версиях
toZonedTime) преобразует UTC-время в объект,
интерпретируемый в заданной зоне.
import { utcToZonedTime } from "date-fns-tz";
const utcDate = new Date("2026-05-22T10:00:00Z");
const zoned = utcToZonedTime(utcDate, "Asia/Almaty");
Важно: возвращаемый объект Date не хранит зону, он лишь
пересчитывает значения компонентов даты для указанного контекста.
Функция zonedTimeToUtc выполняет обратное
преобразование:
import { zonedTimeToUtc } from "date-fns-tz";
const localDate = new Date("2026-05-22T10:00:00");
const utcDate = zonedTimeToUtc(localDate, "Asia/Almaty");
Механика работы:
DateФункция formatInTimeZone является одной из наиболее
значимых в интеграции:
import { formatInTimeZone } from "date-fns-tz";
const date = new Date("2026-05-22T10:00:00Z");
const formatted = formatInTimeZone(
date,
"Asia/Almaty",
"yyyy-MM-dd HH:mm:ssXXX"
);
Особенности:
Datedate-fns предоставляет мощную систему токенов:
yyyy — годMM — месяцdd — деньHH — часыmm — минутыXXX — смещение часового поясаdate-fns-tz расширяет это поведение, позволяя применять форматирование в контексте конкретной зоны без изменения глобального состояния.
Одной из сложных задач является корректная обработка переходов:
Пример:
import { zonedTimeToUtc } from "date-fns-tz";
const ambiguous = zonedTimeToUtc(
new Date("2026-10-25T02:30:00"),
"Europe/Berlin"
);
В таких случаях библиотека использует правила IANA, определяя фактическое UTC-представление.
На сервере все значения приводятся к UTC:
const utc = zonedTimeToUtc(inputDate, userTimeZone);
Это позволяет хранить данные консистентно независимо от региона пользователя.
const display = formatInTimeZone(
storedUtcDate,
userTimeZone,
"dd.MM.yyyy HH:mm"
);
При создании событий важно различать:
const eventUtc = zonedTimeToUtc(localInput, "Asia/Almaty");
Без date-fns-tz:
С использованием:
При одновременной обработке разных регионов типичный подход:
const zones = ["Asia/Almaty", "Europe/Paris", "America/New_York"];
const results = zones.map(zone =>
formatInTimeZone(new Date(), zone, "HH:mm")
);
Такой паттерн часто используется в панелях мониторинга и глобальных интерфейсах.
В экосистеме date-fns-tz существуют изменения между версиями:
utcToZonedTime,
zonedTimeToUtctoZonedTime,
fromZonedTimeНесмотря на различия в именах, концепция остаётся одинаковой: явное преобразование между UTC и IANA-зоной без мутаций исходного объекта.
Интеграция с date-fns и date-fns-tz не решает всех проблем работы с временем:
Date не хранит информацию о зонеПри этом модель остаётся предсказуемой при соблюдении принципа: UTC как источник истины, IANA зона как слой представления.