Извлечение времени

В Day.js работа со временем основана на неизменяемых объектах (immutable instances). Любая операция извлечения возвращает данные без изменения исходного объекта. Это делает модель предсказуемой при цепочках преобразований.

Извлечение времени в Day.js условно делится на три категории:

  • получение отдельных компонентов (часы, минуты, секунды и т.д.)
  • получение календарных значений (дата, месяц, год)
  • получение абсолютных временных значений (timestamp, Unix time)

Каждая категория используется в разных прикладных сценариях — от отображения интерфейсов до синхронизации с сервером.


Получение компонентов времени

Day.js предоставляет единый набор методов-геттеров для доступа к компонентам времени. Эти методы одновременно являются сеттерами, но при вызове без аргументов работают как извлечение значений.

Часы, минуты, секунды, миллисекунды

import dayjs from 'dayjs';

const time = dayjs('2026-05-22T14:35:48.123');

Извлечение основных временных компонентов:

const hours = time.hour();        // 14
const minutes = time.minute();    // 35
const seconds = time.second();    // 48
const ms = time.millisecond();    // 123

Особенности:

  • hour() возвращает значение в 24-часовом формате
  • все методы работают в локальной временной зоне по умолчанию
  • миллисекунды сохраняют точность исходного значения

Извлечение даты и календарных частей

Помимо времени, часто требуется работа с календарными компонентами, которые тесно связаны с временной шкалой.

Год, месяц, день месяца

const year = time.year();     // 2026
const month = time.month();   // 4 (май, так как отсчёт с 0)
const date = time.date();     // 22

Важная особенность:

  • month() возвращает значение в диапазоне 0–11
  • это поведение соответствует стандарту JavaScript Date

День недели

const weekday = time.day(); // 5

Интерпретация:

  • 0 — воскресенье
  • 1 — понедельник
  • 6 — суббота

Этот метод используется для логики расписаний, фильтрации событий и построения календарных интерфейсов.


Извлечение времени в виде timestamp

Одним из наиболее универсальных способов представления времени является Unix timestamp.

Unix-время в секундах

const unix = time.unix(); // 1747924548

Метод возвращает количество секунд, прошедших с 1 января 1970 года UTC.


Timestamp в миллисекундах

const timestamp = time.valueOf(); // 1747924548123

Альтернативный вариант:

const timestamp2 = +time; // аналог valueOf()

Особенности:

  • valueOf() используется в арифметике дат
  • миллисекундное представление применяется в большинстве API и баз данных

Получение стандартного объекта Date

const nativeDate = time.toDate();

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


Форматированное извлечение через format

Хотя format() формально относится к представлению данных, он часто используется как инструмент извлечения конкретных частей времени в строковом виде.

const hours = time.format('HH');
const minutes = time.format('mm');
const seconds = time.format('ss');

Примеры шаблонов:

  • HH — часы (24-часовой формат)
  • hh — часы (12-часовой формат)
  • mm — минуты
  • ss — секунды
  • SSS — миллисекунды

Дополнительные составные форматы:

const fullTime = time.format('HH:mm:ss');
const fullDateTime = time.format('YYYY-MM-DD HH:mm:ss');

Работа с UTC при извлечении времени

При необходимости работы в универсальном времени используется плагин UTC.

import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);

const utcTime = dayjs.utc('2026-05-22T14:35:48Z');

Извлечение компонентов:

utcTime.hour();     // часы в UTC
utcTime.minute();   // минуты в UTC
utcTime.second();   // секунды в UTC

Особенность:

  • переключение в UTC влияет на все методы извлечения
  • локальная временная зона игнорируется

Извлечение времени с учётом временных зон

Для работы с часовыми поясами используется плагин timezone.

import timezone from 'dayjs/plugin/timezone';
import utc from 'dayjs/plugin/utc';

dayjs.extend(utc);
dayjs.extend(timezone);

Пример установки зоны:

const nyTime = dayjs().tz('America/New_York');

Извлечение компонентов:

const h = nyTime.hour();
const m = nyTime.minute();
const s = nyTime.second();

Сравнение с UTC:

const utcTime = nyTime.utc();

nyTime.hour(); // локальное время Нью-Йорка
utcTime.hour(); // UTC-время

Практические паттерны извлечения

Формирование цифровых часов

const now = dayjs();

const clock = {
  h: now.hour(),
  m: now.minute(),
  s: now.second()
};

Проверка диапазонов времени

const hour = dayjs().hour();

const isWorkingTime = hour >= 9 && hour < 18;

Разделение временной метки на компоненты

function extractTimeParts(input) {
  const d = dayjs(input);

  return {
    year: d.year(),
    month: d.month(),
    date: d.date(),
    hour: d.hour(),
    minute: d.minute(),
    second: d.second()
  };
}

Нормализация времени для API

const payload = {
  timestamp: dayjs().valueOf(),
  unix: dayjs().unix()
};

Ошибки и нюансы при извлечении времени

Смещение месяца

dayjs().month(); // январь = 0

Частая ошибка возникает при прямом отображении значения без преобразования.


Локальное время по умолчанию

Все методы извлечения используют локальную временную зону, если не активирован UTC:

dayjs().hour(); // зависит от окружения

Потеря точности при преобразованиях

dayjs().second(0).millisecond(0);

При последовательных изменениях важно учитывать неизменяемость объектов:

const t1 = dayjs();
const t2 = t1.hour(10);

t1.hour(); // исходное значение не изменилось

Различие между valueOf и unix

dayjs().valueOf(); // миллисекунды
dayjs().unix();    // секунды

Использование неправильного формата приводит к ошибкам при синхронизации с внешними системами.


Поведение day()

dayjs().day(); // день недели, а не число месяца

Частая путаница с date() требует различения:

  • date() — день месяца
  • day() — день недели