Смещение часового пояса (timezone offset) — это разница между локальным временем и UTC (Coordinated Universal Time). Значение выражается в минутах или миллисекундах и показывает, насколько локальная временная зона опережает или отстаёт от UTC.
Ключевые особенности:
Встроенный механизм JavaScript предоставляет метод:
new Date().getTimezoneOffset()
Метод возвращает значение в минутах, причём со знаком, противоположным интуитивному:
Пример:
const offset = new Date().getTimezoneOffset();
console.log(offset);
Если результат равен -180, это означает UTC+3.
Для удобства часто выполняется перевод минут в часы:
const offsetMinutes = new Date().getTimezoneOffset();
const offsetHours = -offsetMinutes / 60;
Важно учитывать инверсию знака: getTimezoneOffset()
возвращает обратное значение относительно UTC.
Использование getTimezoneOffset() связано с рядом
ограничений:
Europe/Berlin)Для задач, связанных с календарями, серверной синхронизацией и мультизонными данными, этого недостаточно.
Библиотека date-fns ориентирована на манипуляции с
датами, но не включает полноценную работу с часовыми
поясами.
Для работы с временными зонами используется дополнительный пакет:
date-fns-tzОн расширяет функциональность date-fns и позволяет:
Основной инструмент для вычисления смещения:
import { getTimezoneOffset } from 'date-fns-tz';
Сигнатура:
getTimezoneOffset(timeZone: string, date?: Date | number): number
Возвращаемое значение — смещение в миллисекундах относительно UTC.
import { getTimezoneOffset } from 'date-fns-tz';
const offset = getTimezoneOffset('Europe/Berlin', new Date());
console.log(offset);
Результат может отличаться в зависимости от даты из-за переходов на летнее время.
Значение возвращается в миллисекундах:
Перевод в часы:
const hours = offset / (1000 * 60 * 60);
Одной из ключевых особенностей является динамическое изменение offset.
Например:
Europe/Berlin зимой: UTC+1Europe/Berlin летом: UTC+2При вычислении:
getTimezoneOffset('Europe/Berlin', new Date('2024-01-01'))
getTimezoneOffset('Europe/Berlin', new Date('2024-07-01'))
результаты будут различаться, даже для одной и той же зоны.
Передача даты критична для точности:
const winter = new Date('2024-01-15');
const summer = new Date('2024-07-15');
getTimezoneOffset('America/New_York', winter);
getTimezoneOffset('America/New_York', summer);
Такой подход позволяет учитывать реальные правила перехода времени, а не усреднённые значения.
Offset используется для преобразования локального времени в UTC и обратно.
Общая логика:
В контексте date-fns-tz эти преобразования
инкапсулируются функциями:
zonedTimeToUtcutcToZonedTimeimport { getTimezoneOffset } from 'date-fns-tz';
const date = new Date('2024-03-10T12:00:00');
const offset = getTimezoneOffset('Asia/Tokyo', date);
const utcTime = new Date(date.getTime() - offset);
Использование фиксированного смещения (например, UTC+2) приводит к ошибкам в период перехода на летнее время.
Разные API используют разную систему знаков:
getTimezoneOffset() (JS) — обратный знакdate-fns-tz — стандартное направление относительно
UTCПередача только смещения без зоны:
'+03:00'
лишает возможности корректно обработать сезонные изменения.
При работе с временными зонами устойчивой считается следующая модель:
date-fns-tzПри переходах через полночь offset может влиять на:
Особенно это заметно при сравнении дат в разных зонах.
На сервере, где системная зона может отличаться от пользовательской, offset становится ключевым параметром синхронизации:
Работа со смещением часового пояса в связке date-fns и
date-fns-tz опирается на три уровня: