Метод after и before

Сравнение моментов времени в Luxon выполняется через методы, которые позволяют определить относительное положение одного объекта DateTime относительно другого. Среди них ключевыми являются after и before, возвращающие булевы значения и используемые для логической проверки порядка дат без необходимости вручную сравнивать числовые представления времени.

Объекты DateTime в Luxon представляют собой точку во времени с учётом временной зоны и календарной системы. При сравнении учитывается не строковое представление и не локальный формат, а абсолютное значение момента времени.

Важно понимать, что сравнение корректно работает только между валидными экземплярами DateTime. Любой объект, созданный с ошибкой парсинга, будет считаться невалидным и приведёт к некорректному результату при проверках.

Метод after

Метод after определяет, наступает ли текущий момент времени позже указанного.

import { DateTime } from "luxon";

const dt1 = DateTime.fromISO("2026-05-23T10:00:00");
const dt2 = DateTime.fromISO("2026-05-23T09:00:00");

dt1.after(dt2); // true
dt2.after(dt1); // false

Семантически метод эквивалентен проверке строгого неравенства > в контексте времени.

Особенности поведения:

  • сравнение происходит с учётом временной зоны;
  • возвращается false, если хотя бы один объект невалиден;
  • равные моменты времени дают false.
const a = DateTime.fromISO("2026-05-23T10:00:00Z");
const b = DateTime.fromISO("2026-05-23T10:00:00Z");

a.after(b); // false

Метод before

Метод before выполняет обратную проверку: находится ли текущий момент времени раньше указанного.

import { DateTime } from "luxon";

const dt1 = DateTime.fromISO("2026-05-23T08:00:00");
const dt2 = DateTime.fromISO("2026-05-23T09:00:00");

dt1.before(dt2); // true
dt2.before(dt1); // false

С точки зрения логики он соответствует строгому неравенству <.

Как и after, метод:

  • учитывает временные зоны;
  • возвращает false при равенстве;
  • зависит от валидности объектов DateTime.
const a = DateTime.fromISO("2026-05-23T10:00:00+03:00");
const b = DateTime.fromISO("2026-05-23T07:00:00Z");

a.before(b); // может быть false или true в зависимости от нормализации к UTC

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

Одним из ключевых аспектов работы after и before является приведение времени к единой шкале сравнения. Luxon внутри использует абсолютное время (UTC-основание), поэтому различие в локальных часовых поясах не влияет на корректность сравнения.

const msk = DateTime.fromISO("2026-05-23T12:00:00+03:00");
const utc = DateTime.fromISO("2026-05-23T09:00:00Z");

msk.equals(utc); // true
msk.after(utc);  // false
msk.before(utc); // false

Здесь важно различать равенство и относительные проверки: after и before не учитывают равенство как положительный результат.

Использование в фильтрации данных

Методы часто применяются при работе с массивами дат, особенно при фильтрации событий или построении временных интервалов.

const now = DateTime.now();

const events = [
  DateTime.fromISO("2026-05-20T10:00:00"),
  DateTime.fromISO("2026-05-25T10:00:00"),
  DateTime.fromISO("2026-06-01T10:00:00")
];

const futureEvents = events.filter(e => e.after(now));

Аналогично можно выделить прошедшие события:

const pastEvents = events.filter(e => e.before(now));

Сравнение с границами диапазона

При работе с интервалами времени after и before позволяют формировать логические условия включения и исключения границ.

const start = DateTime.fromISO("2026-05-01T00:00:00");
const end = DateTime.fromISO("2026-05-31T23:59:59");

const point = DateTime.fromISO("2026-05-15T12:00:00");

point.after(start) && point.before(end); // проверка попадания в диапазон

Такая конструкция часто используется вместо создания отдельных объектов Interval, если требуется только логическая проверка.

Сортировка с использованием after и before

Хотя для сортировки обычно применяются числовые представления (toMillis()), методы after и before могут использоваться в компараторах для повышения читаемости логики.

events.sort((a, b) => {
  if (a.before(b)) return -1;
  if (a.after(b)) return 1;
  return 0;
});

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

Граничные случаи и ограничения

Поведение методов становится важным в ситуациях с:

  • некорректными датами (Invalid DateTime);
  • отсутствием временной зоны при неоднозначном парсинге;
  • сравнением дат из разных календарных систем.
const invalid = DateTime.fromISO("not-a-date");
const valid = DateTime.now();

valid.after(invalid); // false
valid.before(invalid); // false

При проектировании логики обработки времени это требует предварительной валидации через isValid.

Эквивалентность через сравнение значений

Хотя Luxon предоставляет специализированные методы, их поведение эквивалентно числовому сравнению временных меток:

  • aftertoMillis() > toMillis()
  • beforetoMillis() < toMillis()
const a = DateTime.now();
const b = DateTime.now();

a.after(b) === (a.toMillis() > b.toMillis());
a.before(b) === (a.toMillis() < b.toMillis());

Разница заключается в читаемости и встроенной обработке временных зон и валидности объектов.