Калькулятор 3 месяцев от даты
Калькулятор прибавляет указанное число месяцев к дате отсчёта и показывает итоговую дату с корректной обработкой конца месяца.
Логика вычислений
Калькулятор прибавляет заданное число месяцев к дате отсчёта и выдаёт итоговую дату вместе с днём недели. Сначала к месяцу исходной даты добавляется нужное количество месяцев, а полученный «сквозной» номер месяца раскладывается обратно на год и месяц:
M = M_0 + N Y = Y_0 + ⌊M / 12⌋ M_итог = M mod 12
где:
- M_0 — порядковый номер месяца даты отсчёта (отсчёт от 0: январь — 0, декабрь — 11);
- N — количество прибавляемых месяцев (может быть и отрицательным для отсчёта назад), мес;
- M — суммарный номер месяца до приведения к диапазону года;
- Y_0, Y — год даты отсчёта и год итоговой даты;
- ⌊ ⌋ — округление вниз (целая часть от деления, определяет, на сколько лет вперёд ушли);
- M_итог — номер месяца итоговой даты в пределах года (приводится к диапазону 0–11).
Число месяца сохраняется тем же, что и в дате отсчёта. Но если в целевом месяце такого числа нет (например, 31 марта при переходе в месяц с 30 или менее днями), берётся последний день целевого месяца:
D_итог = min(D_0, D_посл)
где:
- D_итог — число итоговой даты;
- D_0 — число даты отсчёта;
- D_посл — последний день целевого месяца (28, 29, 30 или 31 — с учётом високосного года).
Итоговая дата собирается из вычисленных года Y, месяца M_итог и числа D_итог. День недели определяется по этой дате календарно.
Примеры расчётов
| Дата отсчёта | Прибавляем месяцев (N) | M = M_0 + N | Год Y | Число D_итог | Итоговая дата | День недели | Комментарий |
|---|---|---|---|---|---|---|---|
| 19.06.2026 | 3 | 5 + 3 = 8 (сентябрь) | 2026 | min(19, 30) = 19 | 19.09.2026 | суббота | Базовый случай: «3 месяца от сегодня», число сохраняется |
| 19.06.2026 | 1 | 5 + 1 = 6 (июль) | 2026 | min(19, 31) = 19 | 19.07.2026 | воскресенье | Прибавление одного месяца в пределах года |
| 15.01.2026 | 12 | 0 + 12 = 12 → Y +1, месяц 0 (январь) | 2027 | min(15, 31) = 15 | 15.01.2027 | пятница | Переход через границу года: ⌊12 / 12⌋ = 1 |
| 31.12.2025 | 3 | 11 + 3 = 14 → Y +1, месяц 2 (март) | 2026 | min(31, 31) = 31 | 31.03.2026 | вторник | В марте есть 31-е число — день сохраняется без обрезки |
| 30.11.2026 | 3 | 10 + 3 = 13 → Y +1, месяц 1 (февраль) | 2027 | min(30, 28) = 28 | 28.02.2027 | воскресенье | В феврале нет 30-го — берётся последний день месяца |
| 29.11.2023 | 3 | 10 + 3 = 13 → Y +1, месяц 1 (февраль) | 2024 | min(29, 29) = 29 | 29.02.2024 | четверг | 2024 — високосный год, поэтому доступно 29-е февраля |
| 19.06.2026 | −3 | 5 − 3 = 2 (март) | 2026 | min(19, 31) = 19 | 19.03.2026 | четверг | Отрицательное N — отсчёт назад от даты |
