SetMilliseconds: примеры (JAVASCRIPT)

Метод setMilliseconds в JavaScript: установка миллисекунд
Раздел: Дата и время, Методы
setMilliseconds(millisecondsValue: number): number

Описание и основы setMilliseconds

Метод setMilliseconds() является частью объекта Date в JavaScript. Он применяется для установки миллисекундной составляющей указанной даты в соответствии с местным временем. Функция может быть полезна при необходимости точного задания или изменения времени с точностью до миллисекунды.

Синтаксис метода: dateObj.setMilliseconds(millisecondsValue).

Аргумент millisecondsValue принимает целое число от 0 до 999, представляющее количество миллисекунд. Если передается значение за пределами этого диапазона (включая отрицательные числа), объект Date автоматически пересчитает другие компоненты даты. Например, значение 1005 увеличит секундную часть на 1, а миллисекунды установит в 5.

Метод возвращает обновленное количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC (эпоха Unix), что эквивалентно значению dateObj.getTime() после изменения.

Примеры использования setMilliseconds

Базовое применение для установки миллисекунд:

const date = new Date('2023-10-05T14:30:00.000Z');
date.setMilliseconds(512);
console.log(date.getMilliseconds());
512

Использование значения вне диапазона:

const date = new Date('2023-10-05T14:30:00.000Z');
date.setMilliseconds(1500);
console.log(date.getMilliseconds());
console.log(date.getSeconds());
500
31

Отрицательные значения также обрабатываются:

const date = new Date('2023-10-05T14:30:00.500Z');
date.setMilliseconds(-200);
console.log(date.getMilliseconds());
console.log(date.getSeconds());
800
29

Похожие функции JavaScript

В JavaScript существует группа методов для установки компонентов даты:

  • setSeconds(secondsValue[, msValue]) - устанавливает секунды, с опциональным параметром миллисекунд. Удобен, когда нужно изменить и секунды, и миллисекунды одновременно.
  • setTime(timeValue) - устанавливает дату, используя количество миллисекунд с эпохи Unix. Это наиболее низкоуровневый метод для полной замены времени.
  • setUTCMilliseconds(msValue) - аналог setMilliseconds, но работающий с временем в формате UTC. Рекомендуется использовать в приложениях, где важна независимость от часового пояса пользователя.

Метод setMilliseconds() обычно применяют, когда требуется изменить только миллисекунды, сохраняя другие части даты неизменными.

Типичные ошибки при работе

1. Передача нечислового значения. Метод ожидает число, другие типы могут привести к неявному преобразованию или NaN.

const date = new Date();
date.setMilliseconds('abc');
console.log(date.getMilliseconds()); // Результат зависит от реализации, часто NaN
NaN

2. Непонимание мутации исходного объекта. Метод изменяет существующий объект Date, а не создает новый.

const date1 = new Date();
const date2 = date1;
date2.setMilliseconds(500);
console.log(date1.getMilliseconds()); // Изменится и date1
500

3. Ожидание, что метод возвращает строку даты. Он возвращает таймстамп, а не форматированную строку.

const date = new Date();
const result = date.setMilliseconds(500);
console.log(typeof result);
console.log(new Date(result).toISOString()); // Для получения строки
number
2023-10-05T14:30:00.500Z

История изменений метода

Метод setMilliseconds() был стандартизирован в ECMAScript 1 (ES1) 1997 года. С тех пор его поведение и спецификация оставались стабильными. Основные изменения связаны не с самим методом, а с общим развитием стандарта Date в JavaScript, такими как улучшение обработки временных зон и введение временной шкалы с высоким разрешением через performance.now().

В ECMAScript 2015 (ES6) и более поздних версиях не было внесено значительных изменений в работу setMilliseconds(). Рекомендуется использовать его в сочетании с UTC-методами для кроссплатформенной согласованности.

Расширенные примеры применения

Сброс миллисекунд в ноль для точного начала интервала:

Пример javascript
function startOfSecond(date) {
    const newDate = new Date(date);
    newDate.setMilliseconds(0);
    return newDate;
}
const now = new Date();
console.log(now.toISOString());
console.log(startOfSecond(now).toISOString());
2023-10-05T14:30:00.123Z
2023-10-05T14:30:00.000Z

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

Пример javascript
function generateTimestamps(start, intervalMs, count) {
    const result = [];
    const date = new Date(start);
    for (let i = 0; i < count; i++) {
        result.push(new Date(date));
        date.setMilliseconds(date.getMilliseconds() + intervalMs);
    }
    return result;
}
const timestamps = generateTimestamps('2023-10-05T00:00:00.000Z', 250, 3);
timestamps.forEach(ts => console.log(ts.toISOString()));
2023-10-05T00:00:00.000Z
2023-10-05T00:00:00.250Z
2023-10-05T00:00:00.500Z

Корректный расчет разницы во времени с высокой точностью, избегая ошибок округления:

Пример javascript
const date1 = new Date('2023-10-05T14:30:00.001Z');
const date2 = new Date('2023-10-05T14:30:00.999Z');
date2.setMilliseconds(date2.getMilliseconds() - date1.getMilliseconds());
console.log(date2.getTime() - date1.getTime()); // Разница в миллисекундах
998

Использование в цикле для микрооптимизации анимации или точного планирования:

Пример javascript
function preciseDelay(targetTime) {
    const now = new Date();
    while (now.getTime() < targetTime) {
        // Активное ожидание (не рекомендуется для основного потока UI)
        now.setMilliseconds(now.getMilliseconds() + 1);
    }
}
// Пример вызова:
// const start = new Date().getTime() + 10;
// preciseDelay(start);

Аналоги функции в других языках

PHP: Метод DateTime::setTime() позволяет установить часы, минуты, секунды и микросекунды. В отличие от JavaScript, поддерживает микросекунды.

$date = new DateTime('2023-10-05 14:30:00');
$date->setTime(14, 30, 0, 512000); // 512 миллисекунд
echo $date->format('Y-m-d H:i:s.u');
2023-10-05 14:30:00.512000

Python: В модуле datetime объект datetime является неизменяемым. Для изменения создается новый объект с помощью метода replace().

from datetime import datetime
dt = datetime(2023, 10, 5, 14, 30, 0, 0)
dt_new = dt.replace(microsecond=512000) # 512 миллисекунд = 512000 микросекунд
print(dt_new)
2023-10-05 14:30:00.512000

MySQL: Функция DATE_ADD() или оператор + INTERVAL могут прибавить миллисекунды, но прямой замены нет.

SELECT '2023-10-05 14:30:00.000' + INTERVAL 512 MILLISECOND;
2023-10-05 14:30:00.512000

JS setMilliseconds function comments

En
SetMilliseconds Sets the milliseconds for a specified date according to local time