SetMonth: примеры (JAVASCRIPT)
setMonth(monthValue: number, dayValue?: number): numberОсновные сведения о setMonth
Метод setMonth() в JavaScript принадлежит объекту Date. Он устанавливает месяц для указанной даты по местному времени.
Функция используется, когда необходимо изменить месяц или месяц и день в существующем объекте Date, например, для корректировки дат в календарях, вычисления будущих или прошедших периодов.
Аргументы
- monthValue (обязательный): Целое число, представляющее месяц. Значения от 0 (январь) до 11 (декабрь). Допускаются значения за пределами этого диапазона. Например, 12 означает январь следующего года, а -1 — декабрь предыдущего года.
- dayValue (необязательный): Целое число от 1 до 31, представляющее день месяца. Если параметр указан, метод устанавливает также и день месяца. Если не указан, используется текущий день месяца объекта Date.
Возвращаемое значение
Метод возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC до обновленной даты. При этом исходный объект Date изменяется.
Простые примеры использования
Установка месяца с использованием стандартных значений.
let date = new Date('2024-01-15');
date.setMonth(5);
console.log(date);Sat Jun 15 2024 03:00:00 GMT+0300 (Москва, стандартное время)
Установка месяца и дня одновременно.
let date = new Date('2024-01-15');
date.setMonth(5, 20);
console.log(date);Thu Jun 20 2024 03:00:00 GMT+0300 (Москва, стандартное время)
Использование значений за пределами обычного диапазона месяцев.
let date = new Date('2024-06-10');
date.setMonth(14);
console.log(date);Mon Mar 10 2025 03:00:00 GMT+0300 (Москва, стандартное время)
Похожие методы в JavaScript
- setUTCMonth(): Устанавливает месяц по всемирному координированному времени (UTC). Используется, когда необходима работа с временем в формате UTC, независимо от локальных настроек.
- setFullYear(): Устанавливает год (а также опционально месяц и день). Предпочтительнее, когда требуется изменить год, чтобы избежать побочных эффектов с днями месяца при переходе через високосные годы.
- setDate(): Устанавливает день месяца. Подходит для манипуляций только с днями, без изменения месяца или года.
Распространенные ошибки
Передача строкового значения вместо числового может привести к неожиданным результатам из-за неявного преобразования типов.
let d = new Date('2024-01-15');
d.setMonth('5'); // Строка '5' преобразуется в число 5
console.log(d.getMonth()); // 5 (июнь) - работает
d.setMonth('abc');
console.log(d.getMonth()); // NaN, дата становится Invalid Date5 NaN
Забывают, что метод изменяет исходный объект.
let originalDate = new Date('2024-01-20');
let newDate = originalDate;
newDate.setMonth(2);
console.log(originalDate.getMonth()); // 2, а не 02
История изменений
Метод setMonth() был стандартизирован в ECMAScript 1 (1997). Существенных изменений в его работе за последние версии стандарта ECMAScript не вносилось. Поведение с нечисловыми аргументами и выходом за диапазон остается стабильным, но зависит от алгоритма преобразования типов, который может уточняться в спецификации.
Расширенные примеры
Корректная обработка последнего дня месяца: установка февраля для даты 31 января.
let date = new Date(2024, 0, 31); // 31 января 2024
date.setMonth(1); // Февраль (месяц 1)
console.log(date); // Февраль имеет только 29 дней в 2024Thu Feb 29 2024 00:00:00 GMT+0300 (Москва, стандартное время)
Использование отрицательных значений для вычитания месяцев.
let date = new Date('2024-06-10');
date.setMonth(-3); // 3 месяца назад от января (0)
console.log(date);Mon Sep 10 2023 03:00:00 GMT+0300 (Москва, стандартное время)
Пакетное изменение дат в массиве с помощью setMonth().
let dates = [new Date('2024-01-10'), new Date('2024-02-15')];
dates.forEach(d => d.setMonth(d.getMonth() + 4));
console.log(dates.map(d => d.toDateString()));['Wed May 10 2024', 'Sat Jun 15 2024']
Расчет даты через несколько лет и месяцев с учетом коррекции дня.
function addMonths(date, monthsToAdd) {
let newDate = new Date(date);
newDate.setMonth(newDate.getMonth() + monthsToAdd);
// Если день не совпадает (попали на короткий месяц), вернуться на последний день
if (newDate.getDate() != date.getDate()) {
newDate.setDate(0); // Последний день предыдущего месяца
}
return newDate;
}
let d = new Date(2023, 0, 31); // 31 января
console.log(addMonths(d, 1).toDateString()); // Добавляем 1 месяцTue Feb 28 2023
Аналоги в других языках программирования
PHP
Функция date_modify() с относительным форматом или создание нового объекта DateTime.
$date = new DateTime('2024-01-15');
$date->modify('+5 month');
echo $date->format('Y-m-d');2024-06-15
Python
Использование метода replace() объекта datetime или timedelta из модуля datetime.
from datetime import datetime, timedelta
date = datetime(2024, 1, 15)
new_date = date.replace(month=6)
print(new_date)2024-06-15 00:00:00
MySQL
Функция DATE_ADD() или оператор INTERVAL.
SELECT DATE_ADD('2024-01-15', INTERVAL 5 MONTH);2024-06-15