Проверка до или после Unix Epoch

Unix Epoch — это точка отсчёта времени, принятого в вычислительной технике: 00:00:00 UTC 1 января 1970 года. В JavaScript и Moment.js время часто представлено в виде числа миллисекунд, прошедших с этого момента. Определение того, находится ли дата до или после Unix Epoch, играет ключевую роль при работе с историческими данными, таймштампами и синхронизацией с внешними API.


Создание объекта Moment

В Moment.js для создания объекта даты используется функция moment():

const date = moment('1969-12-31T23:59:59Z');
  • Если строка соответствует ISO 8601 или RFC 2822, Moment корректно распознаёт дату.
  • Можно передавать отдельные компоненты даты:
const date = moment([1969, 11, 31, 23, 59, 59]); // Год, месяц (0-11), день, часы, минуты, секунды

Важный момент: месяцы в Moment.js индексируются с нуля (0 — январь, 11 — декабрь).


Проверка времени относительно Unix Epoch

Unix Epoch соответствует нулевому значению таймстампа (0 миллисекунд). Moment.js предоставляет методы для получения количества миллисекунд с Epoch:

const timestamp = date.valueOf();
  • timestamp — отрицательное число, если дата до 1 января 1970 года.
  • Положительное число означает, что дата находится после Unix Epoch.

Пример:

const beforeEpoch = moment('1969-12-31T23:59:59Z');
const afterEpoch = moment('1970-01-01T00:00:01Z');

console.log(beforeEpoch.valueOf() < 0); // true
console.log(afterEpoch.valueOf() > 0);  // true

Использование isBefore и isAfter

Moment.js имеет встроенные методы для сравнения дат:

beforeEpoch.isBefore(moment(0)); // true
afterEpoch.isAfter(moment(0));   // true
  • moment(0) создаёт объект Moment, соответствующий точке Unix Epoch.
  • Эти методы позволяют легко проверять относительное положение даты без работы с таймстампами напрямую.

Работа с UTC и локальным временем

При работе с датами до Unix Epoch особенно важно учитывать часовой пояс:

const utcDate = moment.utc('1969-12-31T23:00:00Z');
const localDate = moment('1969-12-31T23:00:00');
  • moment.utc() создаёт объект в UTC, игнорируя локальный смещение.
  • Без utc() Moment интерпретирует время в локальном часовом поясе, что может изменить результат проверки относительно Epoch:
console.log(utcDate.valueOf() < 0);   // true
console.log(localDate.valueOf() < 0); // зависит от часового пояса

Преобразование и нормализация дат

Если необходимо сравнивать даты с Epoch независимо от часового пояса, рекомендуется использовать метод .utc():

const date = moment('1969-12-31T23:59:59').utc();
if (date.isBefore(moment(0))) {
    console.log('Дата до Unix Epoch');
} else {
    console.log('Дата после Unix Epoch');
}

Метод .valueOf() после .utc() даст корректный отрицательный или положительный таймстамп.


Сравнение с текущим временем и Epoch

Можно объединять проверку Unix Epoch с другими условиями:

const now = moment();
const historicalDate = moment('1965-06-15');

if (historicalDate.isBefore(moment(0))) {
    console.log('Дата историческая (до Epoch)');
}

if (historicalDate.isBefore(now)) {
    console.log('Дата в прошлом относительно текущего момента');
}

Такой подход позволяет гибко фильтровать данные: исторические события до Epoch, современные и будущие даты.


Особенности при отрицательных таймстампах

  • Отрицательные миллисекунды в Moment.js корректно обрабатываются.
  • Методы .add(), .subtract() и .diff() работают с отрицательными датами так же, как с положительными.
  • При форматировании дат до Epoch важно учитывать корректный год и календарные вычисления:
moment(-1000000000).format('YYYY-MM-DD HH:mm:ss'); // "1969-12-20 10:13:20"

Резюме технических приёмов

  1. Создание даты до Unix Epoch: moment('1969-12-31T23:59:59Z') или moment([1969, 11, 31, 23, 59, 59]).
  2. Получение таймстампа: date.valueOf(). Отрицательное значение → до Epoch, положительное → после.
  3. Сравнение с Epoch: date.isBefore(moment(0)) или date.isAfter(moment(0)).
  4. Использование UTC для независимости от локального времени: date.utc().
  5. Форматирование отрицательных таймстампов: корректное отображение года, месяца, дня и времени.

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