Работа с дедлайнами

В библиотеке Day.js дедлайн обычно моделируется как фиксированная временная точка, выраженная объектом Day.js. Такой подход позволяет унифицировать сравнение, арифметику и форматирование дат без необходимости работать с низкоуровневым Date.

import dayjs from 'dayjs';

const deadline = dayjs('2026-06-01T18:00:00');

Дедлайн в таком виде становится неизменяемой эталонной точкой, относительно которой выполняются все вычисления: проверка оставшегося времени, определение просрочки, расчёт интервалов.


Нормализация временных значений

При работе с дедлайнами критически важно избегать неоднозначности форматов и часовых поясов. Day.js оперирует локальным временем по умолчанию, поэтому для строгих систем часто подключаются плагины utc и timezone.

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

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

const deadlineUtc = dayjs.utc('2026-06-01T15:00:00Z');
const deadlineLocal = dayjs.tz('2026-06-01 18:00', 'Asia/Almaty');

Использование UTC устраняет эффект «смещения дедлайна» при смене региона пользователя.


Проверка наступления дедлайна

Основная операция — определение, истёк ли срок. Для этого используются методы сравнения:

const now = dayjs();

const isExpired = now.isAfter(deadline);

Если необходимо строгое сравнение без учёта миллисекундных погрешностей:

const isExpired = now.isSameOrAfter(deadline);

Часто логика строится вокруг трёх состояний:

  • дедлайн ещё не наступил
  • дедлайн наступает сейчас
  • дедлайн уже просрочен
if (now.isBefore(deadline)) {
  // активное задание
} else if (now.isSame(deadline)) {
  // момент дедлайна
} else {
  // просрочено
}

Вычисление оставшегося времени

Для отображения прогресса или обратного отсчёта используется разница между текущим временем и дедлайном.

const minutesLeft = deadline.diff(dayjs(), 'minute');

Day.js поддерживает различные единицы измерения:

  • millisecond
  • second
  • minute
  • hour
  • day
  • week
  • month
  • year

Для более сложных сценариев используется разложение на компоненты:

const diff = deadline.diff(dayjs());

const days = Math.floor(diff / (1000 * 60 * 60 * 24));
const hours = Math.floor((diff / (1000 * 60 * 60)) % 24);

Формирование «мягких» дедлайнов

В системах планирования часто используются дедлайны, округлённые до конца дня или начала периода.

const endOfDayDeadline = dayjs().endOf('day');
const startOfDayDeadline = dayjs().startOf('day');

Такой подход применяется в задачах с дневными квотами, отчётностью или системами таск-трекинга.


Добавление буферного времени

Для предотвращения пограничных ошибок вводится буфер:

const safeDeadline = deadline.subtract(5, 'minute');

Буферное время используется в системах:

  • автоматической отправки заданий
  • очередей обработки
  • фоновых задач

Сравнение дедлайнов между собой

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

const sorted = tasks.sort((a, b) => a.deadline.diff(b.deadline));

Где deadline — объект Day.js. Это обеспечивает стабильную сортировку без преобразования в числа вручную.


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

Для определения попадания в интервал используется комбинация условий:

const isInRange =
  now.isAfter(startDeadline) &&
  now.isBefore(endDeadline);

При подключении isBetween логика становится компактнее:

import isBetween from 'dayjs/plugin/isBetween';

dayjs.extend(isBetween);

const isInRange = now.isBetween(startDeadline, endDeadline);

Работа с повторяющимися дедлайнами

Повторяющиеся сроки формируются через базовый шаблон и инкремент времени:

const baseDeadline = dayjs('2026-01-01T09:00:00');

const nextDeadline = baseDeadline.add(7, 'day');

Типовые паттерны:

  • ежедневные задания: add(1, 'day')
  • еженедельные: add(1, 'week')
  • ежемесячные: add(1, 'month')

Проверка близости дедлайна

Для триггеров уведомлений важно определять приближение к сроку:

const inOneHour = deadline.diff(dayjs(), 'hour') <= 1;

Более точная логика:

const isNearDeadline =
  deadline.diff(dayjs(), 'minute') <= 30 &&
  deadline.isAfter(dayjs());

Ограничение времени выполнения задач

В системах контроля задач дедлайн часто используется как жёсткий лимит исполнения:

function canExecute(task) {
  return dayjs().isBefore(task.deadline);
}

Если задача выполняется асинхронно, добавляется проверка в процессе:

async function runTask(task) {
  if (dayjs().isAfter(task.deadline)) return;

  await task.execute();

  if (dayjs().isAfter(task.deadline)) {
    // результат может быть помечен как просроченный
  }
}

Дедлайны в распределённых системах

В распределённых системах важно фиксировать момент создания дедлайна независимо от клиента:

const createdAt = dayjs().utc();
const deadline = createdAt.add(2, 'hour');

Такой подход исключает рассинхронизацию времени между устройствами.


Форматирование дедлайнов для отображения

Часто требуется человекочитаемое представление:

deadline.format('YYYY-MM-DD HH:mm:ss');

Для интерфейсов с локализацией:

import 'dayjs/locale/ru';

dayjs.locale('ru');

deadline.format('D MMMM YYYY, HH:mm');

Обработка просроченных значений

Просроченные дедлайны могут приводить к отрицательным интервалам:

const diff = deadline.diff(dayjs());

if (diff < 0) {
  // задача просрочена
}

Для отображения времени просрочки используется модуль абсолютного значения:

const overdueMinutes = Math.abs(diff) / (1000 * 60);

Стабильность вычислений и неизменяемость объектов

Объекты Day.js не мутируют исходные значения, каждая операция возвращает новый экземпляр:

const original = dayjs('2026-06-01');
const modified = original.add(1, 'day');

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

const finalDeadline = dayjs()
  .add(2, 'day')
  .subtract(3, 'hour')
  .endOf('hour');