setMonth() изменяет месяц в объекте Date, меняет существующую дату. При необходимости он может сразу обновить не только месяц, но и день месяца.
Синтаксис
Базовая запись выглядит так:
date.setMonth(monthValue)
date.setMonth(monthValue, dateValue)
Где:
date- это объектDatemonthValue- новый месяцdateValue- необязательный день месяца
Что возвращает setMonth()
Метод возвращает timestamp - количество миллисекунд с 1 января 1970 года.
const date = new Date(2025, 0, 15);
const result = date.setMonth(5);
console.log(typeof result); // "number"
console.log(result === date.getTime()); // true
console.log(date.getMonth()); // 5
Это важно: setMonth() возвращает число, а не новый объект Date.
Простой пример
const date = new Date(2025, 0, 15);
date.setMonth(5);
console.log(date.getMonth()); // 5
Здесь:
2025- год0- январь15- день месяца
После вызова метода месяц становится 5, то есть июнем.
Месяцы считаются от 0 до 11
Это главный нюанс, о котором чаще всего забывают.
В setMonth():
0- январь1- февраль2- март- …
11- декабрь
const date = new Date(2025, 0, 15);
date.setMonth(1);
console.log(date.getMonth()); // 1
Здесь 1 означает февраль, а не январь.
Можно сразу изменить месяц и день
У setMonth() есть дополнительный аргумент dateValue.
С его помощью можно за один вызов изменить и месяц, и день месяца.
const date = new Date(2025, 0, 15);
date.setMonth(5, 20);
console.log(date.getMonth()); // 5
console.log(date.getDate()); // 20
Здесь:
5- июнь20- день месяца
setMonth() меняет исходную дату
Это главное отличие от методов вроде getMonth().
setMonth() не просто читает значение, а изменяет сам объект Date.
const date = new Date(2025, 0, 15);
date.setMonth(5);
console.log(date.getMonth()); // 5
Если объект даты используется в нескольких местах, это поведение важно учитывать.
Чем setMonth() отличается от getMonth()
Эти методы связаны, но делают разное.
getMonth()читает месяцsetMonth()изменяет месяц
const date = new Date(2025, 0, 15);
console.log(date.getMonth()); // 0
date.setMonth(5);
console.log(date.getMonth()); // 5
setMonth() работает по локальному времени
Это важный момент.
Метод setMonth() изменяет дату с точки зрения локального часового пояса пользователя.
Если нужно менять месяц именно по UTC, используют setUTCMonth().
Чем setMonth() отличается от setUTCMonth()
Разница такая:
setMonth()изменяет месяц по локальному времениsetUTCMonth()изменяет месяц поUTC
Во многих случаях результат будет похожим, но при работе с серверным временем и ISO-строками лучше использовать тот метод, который соответствует вашей задаче.
Месяц может выходить за пределы 0..11
Это полезная особенность Date.
Если передать значение больше 11 или меньше 0, JavaScript автоматически сдвинет год.
const date = new Date(2025, 0, 15);
date.setMonth(12);
console.log(date.getFullYear()); // 2026
console.log(date.getMonth()); // 0
console.log(date.getDate()); // 15
Здесь 12 означает переход к январю следующего года.
День месяца тоже может сдвинуться
Это ещё один важный нюанс.
Если текущий день не существует в новом месяце, JavaScript нормализует дату автоматически.
const date = new Date(2025, 0, 31);
date.setMonth(1);
console.log(date.getFullYear()); // 2025
console.log(date.getMonth()); // 2
console.log(date.getDate()); // 3
Здесь 31 января 2025 года превращается в 3 марта 2025 года, потому что в феврале 2025 года только 28 дней.
Если нужно точнее контролировать результат, часто полезно передавать второй аргумент:
const date = new Date(2025, 0, 31);
date.setMonth(1, 1);
console.log(date.getMonth()); // 1
console.log(date.getDate()); // 1
Invalid Date не восстанавливается через setMonth()
Это отличие от некоторых других методов работы с датой.
Если объект уже невалидный, setMonth() не сможет сделать его рабочим снова.
const date = new Date("invalid");
console.log(date.setMonth(5)); // NaN
console.log(String(date)); // "Invalid Date"
Невалидное значение делает дату Invalid Date
Если в setMonth() передать NaN или значение, которое превращается в NaN, результатом будет невалидная дата.
const date = new Date(2025, 0, 15);
console.log(date.setMonth(NaN)); // NaN
console.log(String(date)); // "Invalid Date"
Это важно помнить, если месяц приходит из формы, API или пользовательского ввода.
setMonth() не создаёт новый объект даты
Этот метод не создаёт новую дату рядом со старой.
Он изменяет уже существующий объект Date.
const date = new Date(2025, 0, 15);
const sameDate = date;
date.setMonth(5);
console.log(sameDate.getMonth()); // 5
Обе переменные указывают на один и тот же объект.
Когда это полезно
setMonth() особенно удобен, когда:
- нужно изменить месяц у существующей даты
- вы сдвигаете дату на несколько месяцев вперёд или назад
- хотите собрать новую дату на основе уже существующей
- нужно сразу обновить месяц и день месяца
Пример:
const promoEnd = new Date(2025, 0, 15);
promoEnd.setMonth(6);
console.log(promoEnd.getMonth()); // 6
Частые ошибки
Ожидать новый объект Date, а не изменение старого
const date = new Date(2025, 0, 15);
date.setMonth(5);
console.log(date.getMonth()); // 5
Метод меняет исходный объект.
Ожидать объект Date в результате
const date = new Date(2025, 0, 15);
const result = date.setMonth(5);
console.log(typeof result); // "number"
Результат метода - timestamp, а не объект даты.
Забывать, что месяцы начинаются с 0
const date = new Date(2025, 0, 15);
date.setMonth(1);
console.log(date.getMonth()); // 1
Февраль здесь - это 1, а не 2.
Думать, что значение больше 11 вызовет ошибку
const date = new Date(2025, 0, 15);
date.setMonth(12);
Ошибка не появится. JavaScript просто перенесёт дату на следующий год.
Не учитывать сдвиг дня месяца
const date = new Date(2025, 0, 31);
date.setMonth(1);
Дата может перейти не в февраль, а дальше, если нужного дня в целевом месяце нет.
Путать setMonth() и getMonth()
const date = new Date(2025, 0, 15);
console.log(date.getMonth()); // 0
date.setMonth(5);
Один метод читает значение, другой его изменяет.
Забывать про локальное время
setMonth() работает по локальному часовому поясу пользователя.
Если важен именно UTC, лучше смотреть в сторону setUTCMonth().
Быстрая памятка
setMonth()вызывается у объектаDate- метод изменяет исходную дату
- результатом является
timestamp - можно передать только месяц или сразу месяц и день месяца
- месяцы считаются от
0до11 - значения меньше
0и больше11нормализуются автоматически setMonth()работает по локальному времени- для
UTCестьsetUTCMonth() - у невалидного аргумента результатом будет
Invalid Date Invalid DateчерезsetMonth()не восстанавливается
Коротко
setMonth() в JavaScript нужен, чтобы изменить месяц в объекте Date. Главное, что стоит запомнить: метод меняет исходную дату, возвращает timestamp, считает месяцы от 0 до 11, может автоматически сдвигать год и день месяца и отличается от getMonth() тем, что не читает значение, а именно изменяет его.