Библиотека date-fns-tz расширяет функциональность
date-fns, добавляя корректную работу с часовыми поясами на
основе IANA Time Zone Database. Основная задача инструмента — устранение
типичных проблем JavaScript-даты, связанных с тем, что стандартный
объект Date всегда хранит время в UTC, но отображает его в
локальной системной зоне.
Ключевая особенность подхода — разделение понятий:
date-fns-tz не изменяет сам объект Date.
Вместо этого выполняются преобразования:
"Europe/Berlin",
"Asia/Almaty")Такой подход исключает ошибки мутации и обеспечивает предсказуемость вычислений.
Строковый идентификатор зоны, например:
"UTC""Europe/London""Asia/Tokyo""America/New_York"Эти идентификаторы учитывают:
npm install date-fns date-fns-tz
Одна из основных функций библиотеки. Позволяет форматировать дату так, будто она находится в указанной временной зоне.
import { formatInTimeZone } from 'date-fns-tz'
const date = new Date('2026-01-01T12:00:00Z')
const result = formatInTimeZone(
date,
'Asia/Almaty',
'yyyy-MM-dd HH:mm:ss XXX'
)
Функция:
Datedate-fnsПреобразует UTC-время в “виртуальное локальное время” выбранной зоны.
import { toZonedTime } from 'date-fns-tz'
const utcDate = new Date('2026-01-01T12:00:00Z')
const zonedDate = toZonedTime(utcDate, 'Europe/Berlin')
Важно:
Date не является новым часовым поясом в
прямом смыслеПреобразует локально интерпретированное время в UTC.
import { fromZonedTime } from 'date-fns-tz'
const date = fromZonedTime('2026-01-01 12:00:00', 'Asia/Tokyo')
Используется при:
Ранее использовалась функция:
import { zonedTimeToUtc } from 'date-fns-tz'
Она выполняла аналогичное преобразование, но в современных версиях
чаще заменяется fromZonedTime.
Стандартный объект Date имеет ограничение: он не хранит
информацию о временной зоне.
new Date('2026-01-01T12:00:00')
Интерпретация зависит от среды выполнения:
date-fns-tz решает эту проблему через явное указание
зоны.
import { formatInTimeZone } from 'date-fns-tz'
const date = new Date('2026-06-01T12:00:00Z')
const london = formatInTimeZone(date, 'Europe/London', 'HH:mm')
const tokyo = formatInTimeZone(date, 'Asia/Tokyo', 'HH:mm')
const newYork = formatInTimeZone(date, 'America/New_York', 'HH:mm')
Каждое значение будет различаться из-за смещения и возможного DST.
Одно из ключевых преимуществ — автоматический учёт переходов на летнее время.
Пример ситуации:
Библиотека:
const utc = fromZonedTime('2026-03-10 09:00:00', 'Asia/Almaty')
Используется при:
const eventTime = formatInTimeZone(
event.date,
user.timeZone,
'dd.MM.yyyy HH:mm'
)
Позволяет:
При планировании важно разделять:
date-fns-tz использует форматирование
date-fns.
Часто используемые токены:
yyyy — годMM — месяцdd — деньHH — часы (24h)mm — минутыss — секундыXXX — смещение часового поясаformatInTimeZone(date, 'UTC', 'yyyy-MM-dd HH:mm:ss XXX')
JavaScript содержит встроенный Intl.DateTimeFormat,
однако date-fns-tz отличается:
date-fnsIntl:
date-fns-tz:
Проблема:
Решение:
Проблема:
Решение:
Проблема:
Решение:
date-fns-tzdate-fns-tz:
Это делает библиотеку подходящей для:
fromZonedTime)formatInTimeZone)При работе с распределёнными системами критично фиксировать:
date-fns-tz выступает промежуточным слоем, исключающим
неоднозначность интерпретации времени.