SetHours: примеры (JAVASCRIPT)
setHours(hoursValue: Number, [minutesValue, secondsValue, msValue]: Number): Number (milliseconds)Метод setHours в JavaScript
Метод setHours() принадлежит к объекту Date в JavaScript. Он используется для установки часов, а также, опционально, минут, секунд и миллисекунд для указанной даты по местному времени.
Аргументы метода:
hoursValue(обязательный) - целое число от 0 до 23, представляющее часы.minutesValue(необязательный) - целое число от 0 до 59, представляющее минуты. Если не указан, используется значение минут из объектаDate.secondsValue(необязательный) - целое число от 0 до 59, представляющее секунды. Если не указан, используется значение секунд из объектаDate.msValue(необязательный) - целое число от 0 до 999, представляющее миллисекунды. Если не указан, используется значение миллисекунд из объектаDate.
Возвращаемое значение:
Метод возвращает количество миллисекунд, прошедших с полуночи 1 января 1970 года по всемирному координированному времени (эпоха Unix) для обновленной даты. Это новое числовое значение временной метки. При этом исходный объект Date мутирует, то есть изменяется.
Простые примеры использования setHours
Установка только часов:
let date = new Date('2024-01-15T10:30:00');
console.log('Исходная дата:', date.toString());
// Устанавливаем 15 часов
let newTimestamp = date.setHours(15);
console.log('Измененная дата (в строке):', date.toString());
console.log('Возвращенная метка времени:', newTimestamp);Исходная дата: Mon Jan 15 2024 10:30:00 GMT+... Измененная дата (в строке): Mon Jan 15 2024 15:30:00 GMT+... Возвращенная метка времени: 1705336200000
Установка часов, минут и секунд:
let date = new Date('2024-05-20');
date.setHours(14, 45, 30);
console.log(date.toString());Mon May 20 2024 14:45:30 GMT+...
Установка времени на полночь:
let date = new Date();
date.setHours(0, 0, 0, 0);
console.log('Начало дня:', date.toString());Начало дня: Tue Sep 17 2024 00:00:00 GMT+...
Похожие методы Date в JavaScript
setUTCHours()- выполняет ту же операцию, но устанавливает часы по UTC, а не по местному времени.setMinutes(),setSeconds(),setMilliseconds()- устанавливают соответствующие единицы времени, но работают независимо.getHours(),getUTCHours()- используются для получения значений.
Метод setHours() предпочтительнее использовать, когда нужно изменить несколько компонентов времени (часы, минуты, секунды) одновременно. Для работы с UTC применяют setUTCHours(). Если нужно изменить только минуты, логично использовать setMinutes().
Распространенные ошибки
1. Ожидание, что метод возвращает строку или объект Date, а не временную метку:
let date = new Date();
let result = date.setHours(10);
console.log(result.toDateString()); // Ошибка!TypeError: result.toDateString is not a function
2. Использование значений вне допустимого диапазона. В этом случае дата "переполняется" и корректируется:
let date = new Date('2024-01-15');
date.setHours(25, 70, 80); // 25 часов, 70 минут, 80 секунд
console.log(date.toString());Tue Jan 16 2024 02:10:20 GMT+...
3. Непонимание мутации объекта:
let originalDate = new Date('2024-01-15T10:00:00');
let copyDate = originalDate;
copyDate.setHours(20);
console.log('Original:', originalDate.toString()); // Изменился!Original: Mon Jan 15 2024 20:00:00 GMT+...
Изменения в спецификации
Метод setHours() присутствует в JavaScript с самых ранних версий (ECMAScript 1). Существенных изменений в его поведении за последние годы не было. Все текущие браузеры и среды выполнения поддерживают его полностью. Разработчикам стоит учитывать, что в ECMAScript 2015 (ES6) и более поздних версиях метод работает точно так же, как и раньше. Совместимость близка к 100%.
Расширенные примеры
Корректировка даты с переполнением параметров ("автоматический" перенос):
let date = new Date(2024, 11, 31, 23, 30); // 31 декабря 2024, 23:30
date.setHours(25); // Устанавливаем 25 часов (1 час следующего дня)
console.log(date.toString()); // Получим 1 января 2025, 1:30Wed Jan 01 2025 01:30:00 GMT+...
Установка времени для всех элементов массива дат:
let dates = [new Date(2024, 0, 1), new Date(2024, 5, 15), new Date(2024, 11, 31)];
dates.forEach(d => d.setHours(12, 0, 0));
console.log(dates.map(d => d.toString()));[ 'Mon Jan 01 2024 12:00:00 GMT+...', 'Sat Jun 15 2024 12:00:00 GMT+...', 'Tue Dec 31 2024 12:00:00 GMT+...' ]
Создание функции для добавления рабочих часов, пропуская нерабочее время (например, с 18:00 до 9:00):
function addBusinessHours(startDate, hoursToAdd) {
let current = new Date(startDate.getTime());
let remainingHours = hoursToAdd;
while (remainingHours > 0) {
let currentHour = current.getHours();
// Если сейчас рабочее время (с 9 до 18)
if (currentHour >= 9 && currentHour < 18) {
let hoursUntilEOD = 18 - currentHour;
let hoursToConsume = Math.min(remainingHours, hoursUntilEOD);
current.setHours(currentHour + hoursToConsume);
remainingHours -= hoursToConsume;
} else {
// Переход к следующему рабочему дню в 9 утра
current.setHours(9, 0, 0, 0);
if (currentHour >= 18) {
current.setDate(current.getDate() + 1);
}
}
}
return current;
}
let start = new Date('2024-09-16T14:00:00'); // Понедельник, 14:00
let result = addBusinessHours(start, 10); // Добавить 10 рабочих часов
console.log('Результат:', result.toString());Результат: Tue Sep 17 2024 16:00:00 GMT+...
Аналоги метода в других языках
Python (datetime.replace или timedelta):
from datetime import datetime, timedelta
# Способ 1: replace
dt = datetime(2024, 1, 15, 10, 30)
dt = dt.replace(hour=15, minute=45)
print(dt) # 2024-01-15 15:45:00
# Способ 2: через timedelta (менее удобно)
dt = datetime(2024, 1, 15)
dt = dt + timedelta(hours=15, minutes=45)
print(dt) # 2024-01-15 15:45:002024-01-15 15:45:00 2024-01-15 15:45:00
PHP (DateTime::setTime):
$date = new DateTime('2024-01-15 10:30:00');
$date->setTime(15, 45, 30);
echo $date->format('Y-m-d H:i:s');2024-01-15 15:45:30
MySQL (DATE_ADD, MAKETIME или изменение формата):
-- Установка конкретного времени
SELECT MAKETIME(15, 45, 30);
-- Изменение времени в существующей дате
SELECT DATE_ADD(DATE('2024-01-15'), INTERVAL '15:45:30' HOUR_SECOND);15:45:30 2024-01-15 15:45:30
Основное отличие JavaScript от Python и PHP заключается в мутации исходного объекта даты, тогда как в Python метод replace возвращает новый объект.