Создание из Unix-времени

Unix-время (Unix Timestamp) — это количество секунд, прошедших с полуночи 1 января 1970 года по UTC. Такой формат широко используется в базах данных, API, логах, системах авторизации, файловых системах и сетевых протоколах.

Пример Unix-времени:

1716288000

Это число представляет конкретную дату и время.

Библиотека Moment.js предоставляет удобные методы для создания объектов даты из Unix-времени и обратного преобразования.


Метод moment.unix()

Для создания даты из Unix Timestamp используется метод moment.unix().

Синтаксис

moment.unix(timestamp)

Параметр timestamp должен содержать количество секунд.

Пример

const moment = require('moment');

const date = moment.unix(1716288000);

console.log(date.format('YYYY-MM-DD HH:mm:ss'));

Результат:

2024-05-21 00:00:00

Отличие Unix-времени от JavaScript Timestamp

В JavaScript объект Date использует миллисекунды:

Date.now()

Пример результата:

1716288000000

В Unix Timestamp используются секунды:

1716288000

Разница критически важна.

Ошибка при передаче миллисекунд

moment.unix(1716288000000)

Результат окажется некорректным, потому что библиотека воспримет число как секунды.


Создание даты из миллисекунд

Если имеется timestamp в миллисекундах, используется обычный вызов moment():

const date = moment(1716288000000);

console.log(date.format('YYYY-MM-DD HH:mm:ss'));

Сравнение способов создания

Unix Timestamp (секунды)

moment.unix(1716288000)

JavaScript Timestamp (миллисекунды)

moment(1716288000000)

Внутреннее преобразование

Метод moment.unix() фактически преобразует секунды в миллисекунды:

moment(timestamp * 1000)

Эквивалентный код:

const date = moment(1716288000 * 1000);

Форматирование даты после создания

После создания объекта доступны все методы форматирования.

Полная дата

moment.unix(1716288000).format('YYYY-MM-DD')

Результат:

2024-05-21

Время

moment.unix(1716288000).format('HH:mm:ss')

Человекочитаемый формат

moment.unix(1716288000).format('DD.MM.YYYY HH:mm')

Работа с UTC

Unix-время всегда основано на UTC.

Создание UTC-даты

const date = moment.unix(1716288000).utc();

console.log(date.format());

Локальное время и UTC

Локальное время

moment.unix(1716288000).format()

UTC

moment.unix(1716288000).utc().format()

Разница зависит от часового пояса системы.


Получение Unix-времени из объекта Moment

Для обратного преобразования используется метод unix().

Пример

const date = moment('2024-05-21');

console.log(date.unix());

Результат:

1716249600

Разница между unix() и valueOf()

unix()

Возвращает секунды:

moment().unix()

valueOf()

Возвращает миллисекунды:

moment().valueOf()

Создание текущего Unix-времени

Текущее время в секундах

const timestamp = moment().unix();

console.log(timestamp);

Текущее время в миллисекундах

const timestamp = moment().valueOf();

Проверка корректности данных

Unix Timestamp должен быть числом.

Пример проверки

const timestamp = 1716288000;

if (typeof timestamp === 'number') {
    const date = moment.unix(timestamp);

    console.log(date.format());
}

Преобразование строкового timestamp

Многие API возвращают Unix-время строкой.

Пример

const timestamp = '1716288000';

const date = moment.unix(Number(timestamp));

console.log(date.format());

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

Unix-время часто приходит от серверов.

Пример ответа API

{
    "created_at": 1716288000
}

Обработка

const response = {
    created_at: 1716288000
};

const created = moment.unix(response.created_at);

console.log(created.format('DD.MM.YYYY HH:mm:ss'));

Работа с отрицательным Unix-временем

Moment.js поддерживает даты до 1970 года.

Пример

const date = moment.unix(-1);

console.log(date.format());

Результат:

1969-12-31T23:59:59+00:00

Добавление времени после создания

После создания даты можно выполнять арифметические операции.

Добавление дней

const date = moment.unix(1716288000)
    .add(7, 'days');

console.log(date.format());

Вычитание часов

const date = moment.unix(1716288000)
    .subtract(5, 'hours');

Сравнение дат из Unix-времени

Проверка равенства

const a = moment.unix(1716288000);
const b = moment.unix(1716288000);

console.log(a.isSame(b));

Проверка порядка

const a = moment.unix(1716288000);
const b = moment.unix(1716374400);

console.log(a.isBefore(b));

Разница между датами

const start = moment.unix(1716288000);
const end = moment.unix(1716374400);

console.log(end.diff(start, 'days'));

Результат:

1

Создание массива дат из timestamp

const timestamps = [
    1716288000,
    1716374400,
    1716460800
];

const dates = timestamps.map(ts => {
    return moment.unix(ts).format('YYYY-MM-DD');
});

console.log(dates);

Сортировка по Unix-времени

Unix Timestamp удобно использовать для сортировки.

Сортировка по возрастанию

const timestamps = [
    1716460800,
    1716288000,
    1716374400
];

timestamps.sort((a, b) => a - b);

console.log(timestamps);

Использование в базе данных

Во многих системах Unix-время хранится как INTEGER.

Пример записи

created_at INTEGER

Чтение из базы

const createdAt = 1716288000;

const date = moment.unix(createdAt);

console.log(date.format());

Частые ошибки

Передача миллисекунд в moment.unix()

Неправильно:

moment.unix(1716288000000)

Правильно:

moment(1716288000000)

Отсутствие UTC

Неправильно:

moment.unix(timestamp)

Правильно для UTC:

moment.unix(timestamp).utc()

Использование строк без преобразования

Нежелательно:

moment.unix('1716288000')

Лучше:

moment.unix(Number('1716288000'))

Производительность

Unix Timestamp имеет несколько преимуществ:

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

Практический пример: журнал событий

const logs = [
    {
        id: 1,
        time: 1716288000
    },
    {
        id: 2,
        time: 1716374400
    }
];

logs.forEach(log => {
    const date = moment.unix(log.time);

    console.log(
        `Событие ${log.id}: ${date.format('DD.MM.YYYY HH:mm:ss')}`
    );
});

Практический пример: таймер истечения

const expiresAt = 1716374400;

const now = moment().unix();

if (now > expiresAt) {
    console.log('Срок истёк');
} else {
    console.log('Активно');
}

Практический пример: вычисление возраста записи

const createdAt = 1716200000;

const created = moment.unix(createdAt);

const days = moment().diff(created, 'days');

console.log(days);

Использование с часовыми поясами

При подключении плагина Moment Timezone становится доступна работа с часовыми поясами.

Пример

const date = moment.unix(1716288000)
    .tz('Europe/Moscow');

console.log(date.format());

Комбинация с относительным временем

const date = moment.unix(1716288000);

console.log(date.fromNow());

Возможный результат:

2 days ago

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

const start = moment.unix(1716288000);
const end = moment.unix(1716374400);

while (start.isBefore(end)) {
    console.log(start.format('YYYY-MM-DD'));

    start.add(1, 'day');
}

Проверка валидности даты

const date = moment.unix(1716288000);

console.log(date.isValid());

Преобразование в объект Date

const date = moment.unix(1716288000).toDate();

console.log(date);

Преобразование в ISO-формат

const iso = moment.unix(1716288000).toISOString();

console.log(iso);

Использование в Node.js

Установка

npm install moment

Подключение

const moment = require('moment');

Использование в браузере

<script src="moment.min.js"></script>

Пример

const date = moment.unix(1716288000);

console.log(date.format());

Когда использовать Unix Timestamp

Unix-время особенно полезно в следующих случаях:

  • хранение дат в базах данных;
  • обмен данными между сервером и клиентом;
  • работа с API;
  • логирование событий;
  • сравнение временных меток;
  • системы авторизации и токены;
  • таймеры и дедлайны;
  • сортировка по времени;
  • кэширование и TTL;
  • аналитика и статистика событий.