SetUTCMonth: примеры (JAVASCRIPT)
setUTCMonth(monthValue: number, dayValue?: number): numberФункция setUTCMonth в JavaScript
Метод setUTCMonth() устанавливает месяц для указанной даты по всемирному координированному времени (UTC). Эта функция изменяет объект Date напрямую и возвращает новое временное значение.
Использование метода актуально при работе с датами в UTC, что позволяет избежать проблем, связанных с часовыми поясами и летним временем.
Аргументы функции
- monthValue (обязательный): целое число от 0 до 11, представляющее месяцы с января (0) по декабрь (11).
- dayValue (необязательный): целое число от 1 до 31, представляющее день месяца. Если параметр не указан, используется значение, возвращаемое методом
getUTCDate().
Возвращаемое значение
Функция возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC до обновленной даты. Это числовое значение, аналогичное результату работы метода Date.prototype.getTime().
Примеры использования setUTCMonth
Базовое использование
let date = new Date('2023-01-15T12:00:00Z');
console.log(date.toISOString());
date.setUTCMonth(5);
console.log(date.toISOString());2023-01-15T12:00:00.000Z 2023-06-15T12:00:00.000Z
Установка месяца с указанием дня
let date = new Date('2023-03-10T00:00:00Z');
date.setUTCMonth(8, 25);
console.log(date.toISOString());2023-09-25T00:00:00.000Z
Корректная обработка перехода через год
let date = new Date('2023-11-20T12:00:00Z');
date.setUTCMonth(12);
console.log(date.toISOString());2024-01-20T12:00:00.000Z
Альтернативные функции в JavaScript
setMonth()
Устанавливает месяц для указанной даты по местному времени. Работает аналогично setUTCMonth(), но учитывает локальный часовой пояс.
setUTCFullYear()
Устанавливает полный год для указанной даты по UTC. Позволяет устанавливать год, месяц и день одновременно.
Момент.js или аналогичные библиотеки
Библиотеки для работы с датами предоставляют более удобный API и расширенные возможности для манипуляций с датами и временем.
Рекомендуется использовать setUTCMonth() при работе с серверным временем или когда необходима независимость от часовых поясов. Для отображения дат в интерфейсе пользователя чаще применяется setMonth().
Распространенные ошибки
Использование значений вне допустимого диапазона
let date = new Date('2023-01-15');
date.setUTCMonth(12); // 12 означает январь следующего года
console.log(date.getUTCFullYear(), date.getUTCMonth());2024 0
Путаница между нумерацией месяцев
// Ошибка: попытка установить декабрь значением 12
let date = new Date();
date.setUTCMonth(12); // Фактически устанавливается январь следующего года
console.log(date.getUTCMonth()); // 0 (январь)0
Игнорирование возвращаемого значения
let date = new Date();
let result = date.setUTCMonth(5);
console.log(typeof result); // number, а не объект Date
console.log(result === date.getTime()); // truenumber true
Изменения в последних версиях
Метод setUTCMonth() не претерпел существенных изменений в последних версиях ECMAScript. Однако, начиная с ES5, числовые значения, выходящие за допустимые диапазоны, корректно обрабатываются (например, месяц 13 увеличивает год на 1 и устанавливает месяц в 1).
В современных реализациях JavaScript улучшена производительность и исправлены редкие ошибки, связанные с обработкой високосных лет и переходом на летнее время.
Расширенные примеры применения
Установка последнего дня месяца
function setLastUTCDayOfMonth(date, month) {
let tempDate = new Date(date);
// Устанавливаем следующий месяц
tempDate.setUTCMonth(month + 1, 0); // День 0 = последний день предыдущего месяца
date.setUTCMonth(month, tempDate.getUTCDate());
return date;
}
let date = new Date('2023-02-15T12:00:00Z');
setLastUTCDayOfMonth(date, 1); // Февраль
console.log(date.toISOString());2023-02-28T12:00:00.000Z
Пакетная установка дат в массиве
let dates = [
new Date('2023-01-10'),
new Date('2023-03-20'),
new Date('2023-05-30')
];
// Устанавливаем для всех дат август
let results = dates.map(date => {
let newDate = new Date(date);
newDate.setUTCMonth(7);
return newDate;
});
console.log(results.map(d => d.toISOString().slice(0, 10)));['2023-08-10', '2023-08-20', '2023-08-30']
Сравнение производительности с setMonth()
let dateUTC = new Date();
let dateLocal = new Date();
console.time('setUTCMonth');
for (let i = 0; i < 1000000; i++) {
dateUTC.setUTCMonth(i % 12);
}
console.timeEnd('setUTCMonth');
console.time('setMonth');
for (let i = 0; i < 1000000; i++) {
dateLocal.setMonth(i % 12);
}
console.timeEnd('setMonth');setUTCMonth: 45.123ms setMonth: 78.456ms
Аналоги функции в других языках
Python: datetime.replace()
from datetime import datetime
dt = datetime(2023, 1, 15, 12, 0, 0)
new_dt = dt.replace(month=6)
print(new_dt.isoformat())2023-06-15T12:00:00
PHP: DateTime::setDate()
$date = new DateTime('2023-01-15T12:00:00Z');
$date->setDate($date->format('Y'), 6, $date->format('d'));
echo $date->format('c');2023-06-15T12:00:00+00:00
MySQL: DATE_ADD()
SELECT DATE_ADD('2023-01-15', INTERVAL 5 MONTH) AS new_date;2023-06-15
Основное отличие JavaScript-функции в том, что она изменяет существующий объект Date, тогда как во многих других языках даты являются неизменяемыми, и методы возвращают новые объекты.