Миллисекунда — минимальная единица времени, с которой работает
JavaScript при представлении даты. Внутри объекта Date
время хранится как количество миллисекунд, прошедших с полуночи 1 января
1970 года по UTC. Библиотека Moment.js использует тот же принцип,
поэтому создание объекта из миллисекунд является одной из базовых
операций.
Начальной точкой отсчёта считается:
1970-01-01T00:00:00.000Z
Каждая последующая миллисекунда увеличивает значение времени.
Пример:
const timestamp = 1000;
Это значение соответствует:
1970-01-01T00:00:01.000Z
Поскольку прошло 1000 миллисекунд, то есть одна секунда.
Для создания объекта используется функция 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'));
Важно различать:
| Формат | Пример | Описание |
|---|---|---|
| Миллисекунды | 1716287654321 |
Полное значение времени |
| Unix Timestamp | 1716287654 |
Количество секунд |
Moment.js умеет работать с обоими форматами.
moment(1716287654321);
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());
valueOf()const date = moment();
console.log(date.valueOf());
Результат:
1716287654321
unix()Возвращает секунды.
console.log(date.unix());
const nativeDate = new Date();
const momentDate = moment(nativeDate);
const jsDate = moment().toDate();
console.log(jsDate);
Moment.js поддерживает объект продолжительности —
duration.
const duration = moment.duration(5000);
console.log(duration.asSeconds());
Результат:
5
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
По умолчанию Moment.js использует локальный часовой пояс.
Для работы с UTC:
const utcDate = moment.utc(1000);
console.log(utcDate.format());
Результат:
1970-01-01T00:00:01Z
moment(0).format();
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
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
Многие серверы возвращают время в миллисекундах.
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);
moment(undefined);
Такой вызов создаёт текущую дату, а не ошибку.
Для проверки значения:
if (value !== undefined) {
moment(value);
}
moment(0);
Создаёт локальное время.
Для UTC требуется:
moment.utc(0);
| Метод | Назначение |
|---|---|
moment(ms) |
Создание даты из миллисекунд |
moment.unix(sec) |
Создание даты из секунд |
valueOf() |
Получение миллисекунд |
unix() |
Получение секунд |
add() |
Добавление времени |
subtract() |
Вычитание времени |
diff() |
Разница между датами |
millisecond() |
Работа с миллисекундами |
duration() |
Работа с продолжительностью |
utc() |
Работа в UTC |