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

Миллисекунда — минимальная единица времени, с которой работает JavaScript при представлении даты. Внутри объекта Date время хранится как количество миллисекунд, прошедших с полуночи 1 января 1970 года по UTC. Библиотека Moment.js использует тот же принцип, поэтому создание объекта из миллисекунд является одной из базовых операций.

Unix Epoch и миллисекунды

Начальной точкой отсчёта считается:

1970-01-01T00:00:00.000Z

Каждая последующая миллисекунда увеличивает значение времени.

Пример:

const timestamp = 1000;

Это значение соответствует:

1970-01-01T00:00:01.000Z

Поскольку прошло 1000 миллисекунд, то есть одна секунда.


Создание Moment-объекта из миллисекунд

Для создания объекта используется функция moment().

const momentDate = moment(1000);

console.log(momentDate.format());

Результат:

1970-01-01T03:00:01+03:00

Время отображается с учётом локального часового пояса системы.


Работа с текущим временем в миллисекундах

Текущее время можно получить через:

const now = Date.now();

console.log(now);

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

1716287654321

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

const currentMoment = moment(Date.now());

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

Разница между миллисекундами и Unix Timestamp

Важно различать:

Формат Пример Описание
Миллисекунды 1716287654321 Полное значение времени
Unix Timestamp 1716287654 Количество секунд

Moment.js умеет работать с обоими форматами.

Миллисекунды

moment(1716287654321);

Unix Timestamp в секундах

moment.unix(1716287654);

Преобразование миллисекунд в читаемую дату

Форматирование даты

const date = moment(1716287654321);

console.log(date.format('DD.MM.YYYY'));

Результат:

21.05.2024

Форматирование времени

console.log(date.format('HH:mm:ss'));

Результат:

14:34:12

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

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

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

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

const oldDate = moment(-1000);

console.log(oldDate.format());

Результат:

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

Отрицательное значение означает время до Unix Epoch.


Создание даты из больших значений

const future = moment(9999999999999);

console.log(future.format());

Moment.js корректно обрабатывает далёкие будущие даты, пока они находятся в допустимом диапазоне JavaScript Date.


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

Некоторые значения могут приводить к невалидным датам.

const invalid = moment(NaN);

console.log(invalid.isValid());

Результат:

false

Ещё пример:

const broken = moment(undefined);

console.log(broken.isValid());

Получение миллисекунд из Moment-объекта

Метод valueOf()

const date = moment();

console.log(date.valueOf());

Результат:

1716287654321

Метод unix()

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

console.log(date.unix());

Конвертация между Date и Moment

Из Date в Moment

const nativeDate = new Date();

const momentDate = moment(nativeDate);

Из Moment в Date

const jsDate = moment().toDate();

console.log(jsDate);

Работа с миллисекундами через duration

Moment.js поддерживает объект продолжительности — duration.

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

const duration = moment.duration(5000);

console.log(duration.asSeconds());

Результат:

5

Получение отдельных компонентов duration

const duration = moment.duration(3723000);

console.log(duration.hours());
console.log(duration.minutes());
console.log(duration.seconds());

Результат:

1
2
3

Добавление миллисекунд к дате

Метод add()

const date = moment();

date.add(500, 'milliseconds');

console.log(date.format('HH:mm:ss.SSS'));

Вычитание миллисекунд

const date = moment();

date.subtract(250, 'milliseconds');

console.log(date.format('HH:mm:ss.SSS'));

Работа с точностью до миллисекунд

Формат SSS выводит миллисекунды.

const date = moment();

console.log(
    date.format('HH:mm:ss.SSS')
);

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

18:25:14.381

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

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

Прибавление часа

const hour = 60 * 60 * 1000;

const future = moment(Date.now() + hour);

console.log(future.format());

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

const start = moment(0);

const end = moment(10000);

console.log(
    end.diff(start)
);

Результат:

10000

Разница между объектами в миллисекундах

const first = moment();
const second = moment().add(5, 'seconds');

console.log(
    second.diff(first)
);

Результат:

5000

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

По умолчанию Moment.js использует локальный часовой пояс.

Для работы с UTC:

const utcDate = moment.utc(1000);

console.log(utcDate.format());

Результат:

1970-01-01T00:00:01Z

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

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

moment(0).format();

UTC

moment.utc(0).format();

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


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

JavaScript автоматически округляет дробные значения.

const date = moment(1000.9);

console.log(date.valueOf());

Результат:

1000

Сравнение дат, созданных из миллисекунд

const first = moment(1000);
const second = moment(2000);

console.log(first.isBefore(second));
console.log(second.isAfter(first));

Результат:

true
true

Использование millisecond()

Moment.js позволяет работать отдельно с миллисекундами внутри времени.

const date = moment();

console.log(date.millisecond());

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

381

Установка миллисекунд

date.millisecond(500);

console.log(
    date.format('HH:mm:ss.SSS')
);

Цепочки операций

const result = moment(0)
    .add(1, 'day')
    .add(2, 'hours')
    .add(30, 'minutes')
    .add(150, 'milliseconds');

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

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

const start = moment();

setTimeout(() => {
    const end = moment();

    const diff = end.diff(start);

    console.log(diff);
}, 1000);

Результат будет близок к:

1000

Практический пример преобразования API timestamp

Многие серверы возвращают время в миллисекундах.

const response = {
    createdAt: 1716287654321
};

const created = moment(response.createdAt);

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

Практический пример сортировки дат

const timestamps = [
    1716287654321,
    1716200000000,
    1716300000000
];

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

const moments = timestamps.map(
    value => moment(value)
);

console.log(
    moments.map(date =>
        date.format('HH:mm:ss')
    )
);

Особенности производительности

Создание большого количества объектов Moment.js может быть затратным.

for (let i = 0; i < 100000; i++) {
    moment(i);
}

В высоконагруженных приложениях рекомендуется минимизировать количество создаваемых экземпляров.


Ограничения диапазона дат

Moment.js зависит от возможностей Date.

Максимально допустимые значения:

±8.64e15

Пример:

const max = moment(8640000000000000);

console.log(max.isValid());

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

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

Неверно:

moment(1716287654);

Результат будет датой 1970 года.

Правильно:

moment.unix(1716287654);

или:

moment(1716287654 * 1000);

Работа с undefined

moment(undefined);

Такой вызов создаёт текущую дату, а не ошибку.

Для проверки значения:

if (value !== undefined) {
    moment(value);
}

Неверное ожидание UTC

moment(0);

Создаёт локальное время.

Для UTC требуется:

moment.utc(0);

Краткая сводка методов

Метод Назначение
moment(ms) Создание даты из миллисекунд
moment.unix(sec) Создание даты из секунд
valueOf() Получение миллисекунд
unix() Получение секунд
add() Добавление времени
subtract() Вычитание времени
diff() Разница между датами
millisecond() Работа с миллисекундами
duration() Работа с продолжительностью
utc() Работа в UTC