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()); // Результат зависит от реализации, часто NaNNaN
2. Непонимание мутации исходного объекта. Метод изменяет существующий объект Date, а не создает новый.
const date1 = new Date();
const date2 = date1;
date2.setMilliseconds(500);
console.log(date1.getMilliseconds()); // Изменится и date1500
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-методами для кроссплатформенной согласованности.
Расширенные примеры применения
Сброс миллисекунд в ноль для точного начала интервала:
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
Создание последовательности временных меток с заданным интервалом в миллисекундах:
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
Корректный расчет разницы во времени с высокой точностью, избегая ошибок округления:
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
Использование в цикле для микрооптимизации анимации или точного планирования:
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