Learn JavaScript

setUTCMonth() - изменение месяца по UTC в JavaScript

setUTCMonth() изменяет месяц в объекте Date по UTC, меняет существующую дату. При необходимости он может сразу обновить не только месяц, но и день месяца.

Синтаксис

Базовая запись выглядит так:

date.setUTCMonth(monthValue)
date.setUTCMonth(monthValue, dateValue)

Где:

  • date - это объект Date
  • monthValue - новый месяц по UTC
  • dateValue - необязательный день месяца

Что возвращает setUTCMonth()

Метод возвращает timestamp - количество миллисекунд с 1 января 1970 года.

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));
const result = date.setUTCMonth(5);

console.log(typeof result); // "number"
console.log(result === date.getTime()); // true
console.log(date.toISOString()); // "2025-06-15T12:30:00.000Z"

Это важно: setUTCMonth() возвращает число, а не новый объект Date.

Простой пример

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

date.setUTCMonth(5);

console.log(date.getUTCMonth()); // 5
console.log(date.toISOString()); // "2025-06-15T12:30:00.000Z"

Здесь:

  • 2025 - год
  • 0 - январь
  • 15 - день месяца

После вызова метода месяц по UTC становится 5, то есть июнем.

Месяцы считаются от 0 до 11

Это главный нюанс, о котором чаще всего забывают.

В setUTCMonth():

  • 0 - январь
  • 1 - февраль
  • 2 - март
  • 11 - декабрь
const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

date.setUTCMonth(1);

console.log(date.getUTCMonth()); // 1
console.log(date.toISOString()); // "2025-02-15T12:30:00.000Z"

Здесь 1 означает февраль, а не январь.

Можно сразу изменить месяц и день

У setUTCMonth() есть дополнительный аргумент dateValue.

С его помощью можно за один вызов изменить и месяц, и день месяца по UTC.

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

date.setUTCMonth(5, 20);

console.log(date.getUTCMonth()); // 5
console.log(date.getUTCDate()); // 20
console.log(date.toISOString()); // "2025-06-20T12:30:00.000Z"

Здесь:

  • 5 - июнь
  • 20 - день месяца

setUTCMonth() меняет исходную дату

Это главное отличие от методов вроде getUTCMonth().

setUTCMonth() не просто читает значение, а изменяет сам объект Date.

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

date.setUTCMonth(5);

console.log(date.getUTCMonth()); // 5

Если объект даты используется в нескольких местах, это поведение важно учитывать.

Чем setUTCMonth() отличается от getUTCMonth()

Эти методы связаны, но делают разное.

  • getUTCMonth() читает месяц по UTC
  • setUTCMonth() изменяет месяц по UTC
const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

console.log(date.getUTCMonth()); // 0

date.setUTCMonth(5);

console.log(date.getUTCMonth()); // 5

setUTCMonth() работает именно по UTC

Это главный момент.

Метод setUTCMonth() изменяет дату с точки зрения UTC, а не локального часового пояса пользователя.

Если вы работаете с серверным временем, ISO-строками и данными из API, это поведение обычно удобнее и предсказуемее.

Чем setUTCMonth() отличается от setMonth()

Разница такая:

  • setUTCMonth() изменяет месяц по UTC
  • setMonth() изменяет месяц по локальному времени

Это особенно важно возле границы месяца.

const date = new Date("2025-03-01T00:30:00+03:00");

date.setUTCMonth(2);

console.log(date.toISOString()); // "2025-03-28T21:30:00.000Z"

У setMonth() похожий вызов может дать другой момент времени, потому что он ориентируется на локальный часовой пояс пользователя.

Месяц может выходить за пределы 0..11

Это полезная особенность Date.

Если передать значение больше 11 или меньше 0, JavaScript автоматически сдвинет год.

const date = new Date(Date.UTC(2025, 0, 15, 12, 0, 0));

date.setUTCMonth(12);

console.log(date.getUTCFullYear()); // 2026
console.log(date.getUTCMonth()); // 0
console.log(date.getUTCDate()); // 15
console.log(date.toISOString()); // "2026-01-15T12:00:00.000Z"

Здесь 12 означает переход к январю следующего года.

Точно так же работает и отрицательное значение:

const date = new Date(Date.UTC(2025, 0, 15, 12, 0, 0));

date.setUTCMonth(-1);

console.log(date.getUTCFullYear()); // 2024
console.log(date.getUTCMonth()); // 11
console.log(date.getUTCDate()); // 15

День месяца тоже может сдвинуться

Это ещё один важный нюанс.

Если текущий день не существует в новом месяце, JavaScript нормализует дату автоматически.

const date = new Date(Date.UTC(2025, 0, 31, 12, 0, 0));

date.setUTCMonth(1);

console.log(date.toISOString()); // "2025-03-03T12:00:00.000Z"
console.log(date.getUTCMonth()); // 2
console.log(date.getUTCDate()); // 3

Здесь 31 января 2025 года превращается в 3 марта 2025 года, потому что в феврале 2025 года только 28 дней.

Если нужно точнее контролировать результат, часто полезно передавать второй аргумент:

const date = new Date(Date.UTC(2025, 0, 31, 12, 0, 0));

date.setUTCMonth(1, 1);

console.log(date.getUTCMonth()); // 1
console.log(date.getUTCDate()); // 1
console.log(date.toISOString()); // "2025-02-01T12:00:00.000Z"

Invalid Date не восстанавливается через setUTCMonth()

Это отличие от некоторых других методов работы с датой.

Если объект уже невалидный, setUTCMonth() не сможет сделать его рабочим снова.

const date = new Date("invalid");

console.log(date.setUTCMonth(5)); // NaN
console.log(String(date)); // "Invalid Date"

Невалидное значение делает дату Invalid Date

Если в setUTCMonth() передать NaN или значение, которое превращается в NaN, результатом будет невалидная дата.

const date = new Date(Date.UTC(2025, 0, 15, 12, 0, 0));

console.log(date.setUTCMonth(NaN)); // NaN
console.log(String(date)); // "Invalid Date"

Это важно помнить, если месяц приходит из формы, API или пользовательского ввода.

setUTCMonth() не создаёт новый объект даты

Этот метод не создаёт новую дату рядом со старой.

Он изменяет уже существующий объект Date.

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));
const sameDate = date;

date.setUTCMonth(5);

console.log(sameDate.toISOString()); // "2025-06-15T12:30:00.000Z"

Обе переменные указывают на один и тот же объект.

Когда это полезно

setUTCMonth() особенно удобен, когда:

  • дата хранится в UTC
  • вы работаете с серверным временем
  • нужно одинаковое поведение независимо от часового пояса пользователя
  • нужно менять месяц у ISO-дат и данных из API

Пример:

const promoEnd = new Date("2025-01-15T12:00:00Z");

promoEnd.setUTCMonth(6);

console.log(promoEnd.toISOString()); // "2025-07-15T12:00:00.000Z"

Частые ошибки

Ожидать новый объект Date, а не изменение старого

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

date.setUTCMonth(5);

console.log(date.toISOString()); // "2025-06-15T12:30:00.000Z"

Метод меняет исходный объект.

Ожидать объект Date в результате

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));
const result = date.setUTCMonth(5);

console.log(typeof result); // "number"

Результат метода - timestamp, а не объект даты.

Забывать, что месяцы начинаются с 0

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

date.setUTCMonth(1);

console.log(date.getUTCMonth()); // 1

Февраль здесь - это 1, а не 2.

Думать, что значение больше 11 вызовет ошибку

const date = new Date(Date.UTC(2025, 0, 15, 12, 0, 0));

date.setUTCMonth(12);

Ошибка не появится. JavaScript просто перенесёт дату на следующий год.

Не учитывать сдвиг дня месяца

const date = new Date(Date.UTC(2025, 0, 31, 12, 0, 0));

date.setUTCMonth(1);

Дата может перейти не в февраль, а дальше, если нужного дня в целевом месяце нет.

Путать setUTCMonth() и getUTCMonth()

const date = new Date(Date.UTC(2025, 0, 15, 12, 30, 0));

console.log(date.getUTCMonth()); // 0
date.setUTCMonth(5);

Один метод читает значение, другой его изменяет.

Путать setUTCMonth() и setMonth()

setUTCMonth() работает по UTC, а setMonth() - по локальному часовому поясу пользователя.

Если важен именно UTC, лучше использовать setUTCMonth().

Быстрая памятка

  • setUTCMonth() вызывается у объекта Date
  • метод изменяет исходную дату
  • результатом является timestamp
  • можно передать только месяц или сразу месяц и день месяца
  • месяцы считаются от 0 до 11
  • значения меньше 0 и больше 11 нормализуются автоматически
  • setUTCMonth() работает по UTC
  • для локального времени есть setMonth()
  • у невалидного аргумента результатом будет Invalid Date
  • Invalid Date через setUTCMonth() не восстанавливается

Коротко

setUTCMonth() в JavaScript нужен, чтобы изменить месяц в объекте Date по UTC. Главное, что стоит запомнить: метод меняет исходную дату, возвращает timestamp, считает месяцы от 0 до 11, может автоматически сдвигать год и день месяца и отличается от getUTCMonth() тем, что не читает значение, а изменяет его.