Калькулятор Сложения/Вычитания Дат
Добавляет или вычитает дни, недели, месяцы, годы из даты
Добавить или вычесть дни из даты
Что такое Калькулятор Сложения/Вычитания Дат?
Калькулятор прибавления и вычитания дат находит целевую дату, сдвигая начальную дату вперед или назад на заданное число дней, недель, месяцев или лет. Он полезен для продления договоров, напоминаний, гарантийных сроков, повторных обращений и планирования проекта, когда неудобно считать по календарю вручную. Сложность не только в сложении дней, а в реальных границах календаря: месяцы имеют разную длину, високосный год меняет февраль, а дата вроде 31 января не всегда существует в следующем месяце. Инструмент дает быстрый практический результат для планирования. Он считает календарное время и не учитывает автоматически рабочие дни, праздники, переносы и юридические правила сроков.
Как использовать
Как использовать
- Введите начальную дату
- Выберите прибавление (вперёд) или вычитание (назад)
- Введите значение и выберите единицу (день/неделя/месяц/год)
- Нажмите «Calculate result», чтобы получить целевую дату
Правила расчёта дат
- Прибавление месяцев или лет может привести к более короткому месяцу — проверьте, как ваше бизнес-правило обрабатывает даты вроде 31 января плюс один месяц.
- Для сроков уточните, нужно ли учитывать выходные, праздники и границу конца дня.
Применение
Технический принцип
Арифметика дат в этом инструменте построена на пролептическом григорианском календаре, реализованном объектом ECMAScript Date. Месяцы в JavaScript нумеруются с нуля (январь — 0, декабрь — 11), что является главным источником ошибок со сдвигом на единицу в коде работы с датами. Прибавление дней выполняется напрямую: new Date(d.getTime() + n * 86_400_000). Прибавление месяцев сложнее, поскольку в месяцах 28, 29, 30 или 31 день: стандартный идиоматический вызов date.setMonth(date.getMonth() + n) переполняется, когда результирующий месяц короче исходного дня, поэтому 31 января + 1 месяц даёт 3 марта, а не 28 февраля (движок переносит лишние 3 дня в март). Этот инструмент обнаруживает переполнение, сравнивая date.getMonth() после setMonth, и ограничивает день последним днём целевого месяца при необходимости, что совпадает с поведением moment.js, date-fns и Temporal Plain Date.add(). Високосные годы следуют стандартному правилу григорианского календаря: год является високосным, если он делится на 4, за исключением вековых лет, которые должны также делиться на 400. Таким образом, 1900 и 2100 — обычные годы, а 2000 был високосным и 2024 тоже. Это важно, когда расчёт пересекает 29 февраля: 29 января + 1 месяц + 1 месяц в 2023 году даёт 29 марта, но в 2024 году переход попадает на 29 февраля (допустимая дата), а затем на 29 марта — без необходимости ограничения. Отсечка 1582 года для перехода от юлианского к григорианскому календарю здесь игнорируется, поскольку пролептический григорианский календарь распространяет правила назад бесконечно; даты до 15 октября 1582 года технически анахроничны, но всё равно вычисляются корректно для современных целей. Обработка часовых поясов — отдельное измерение: Date хранит момент UTC во внутреннем представлении и применяет часовой пояс IANA хост-системы (например, America/New_York, Asia/Shanghai) только при вызове .getDate(), .month() или .toLocaleString(). Из этого следуют две ловушки: (1) дата, созданная из ISO-строки без суффикса Z ("2026-06-10"), разбирается как полночь UTC, но "2026-06-10T00:00:00" без Z разбирается как полночь местного времени, и один и тот же date.getDate() может вернуть 9 или 10 в зависимости от смещения пользователя; (2) переходы на летнее/зимнее время весной (пропуск 02:00–03:00) и осенью (повтор 01:00–02:00) делают некоторые вычисления неоднозначными, поэтому прибавление «+24 часа» может привести к показаниям часов, отстоящим на 23 или 25 часов. Для вычислений с рабочими днями, только будними днями или с учётом праздников результат календаря необходимо дополнять обработкой регионального списка праздников (например, через пакет npm date-holidays или собственный календарь), а не полагаться на простой переход через границу.
- Месяцы JS Date нумеруются с нуля: январь = 0, декабрь = 11; ошибка со сдвигом на единицу — самая частая ошибка.
- Переполнение setMonth: 31 января + 1 месяц даёт 3 марта, а не 28 февраля; инструмент ограничивает день концом месяца, сравнивая getMonth() после setMonth.
- Високосный год: делится на 4, но вековые годы должны также делиться на 400 (1900 — нет, 2000 — да, 2024 — да).
- ISO 8601 без Z ("2026-06-10T00:00:00") разбирается как местное время; с Z — как UTC, и getDate() может вернуть другой день.
- Переходы на летнее/зимее время создают 23-часовые и 25-часовые сутки; прибавление +24 ч не всегда равно одному календарному дню.
- Вычисления на уровне дней точны через getTime() + n * 86_400_000; более крупные единицы каскадно проходят через setMonth/setFullYear с ограничением.
- Вычисления с рабочими днями и праздниками должны быть добавлены поверх через региональную календарную таблицу, а не внутри движка.
Примеры
Прибавить 90 дней к начальной дате (триал / ревью OKR)
Начальная дата : 2026-01-15 (четверг)
Операция : + 90 дней
Результат : 2026-04-15 (среда)
Use case : Окончание 90-дневного триала, ревью OKR за Q1Вычесть 6 месяцев от сегодняшней даты
Начальная дата : 2026-06-11
Операция : - 6 месяцев
Результат : 2025-12-11
Use case : Анализ за полгода назад — продления или churnПрибавить 2 года 3 месяца 5 дней (срок визы)
Начальная дата : 2026-01-15
Шаг 1 : + 2 года -> 2028-01-15
Шаг 2 : + 3 месяца -> 2028-04-15
Шаг 3 : + 5 дней -> 2028-04-20
Результат : 2028-04-20Перенос на конец месяца: 31 января + 1 месяц
Начальная дата : 2026-01-31
Операция : + 1 месяц
Результат : 2026-02-28 (в феврале 2026 — 28 дней)
Проверка високосного года:
Начальная дата : 2028-01-31
Операция : + 1 месяц
Результат : 2028-02-29 (2028 — високосный год)Вычесть 14 дней для напоминания о платеже
Продление подписки : 2026-07-01
Операция : - 14 дней
Отправить напоминание: 2026-06-17Часто задаваемые вопросы
Как работает прибавление «месяцев» к датам в конце месяца?
В месяцах разное количество дней, поэтому добавление 1 месяца к 31 января неоднозначно. Калькулятор следует стандартному соглашению: округлить до последнего дня целевого месяца — 31 января + 1 месяц = 28 февраля (или 29 в високосный год). Это совпадает с поведением функции EDATE в Excel.
Учитываются ли выходные и праздники?
По умолчанию да — «прибавить 5 дней» добавляет 5 календарных дней. Для расчёта рабочих дней (с пропуском выходных и опционально праздников) используйте отдельный инструмент «Калькулятор рабочих дней»; эта страница для чисто календарной арифметики.
Можно ли прибавить годы, месяцы, недели и дни одновременно?
Да. Результат применяет их в порядке годы → месяцы → недели → дни — это соглашение используется большинством библиотек дат, включая JavaScript-предложение Temporal. Порядок имеет значение: «1 месяц и 30 дней», прибавленные к 1 января, дадут другую дату, чем «30 дней и 1 месяц».
Как обрабатывается переход на летнее время?
Расчёт работает с календарными датами, а не с абсолютным временем, поэтому прибавление «одного дня» через переход на летнее время даёт то же время суток в местной зоне. Если нужна точность до 24 часов, переключите единицу на часы вместо дней.
Какой диапазон дат поддерживается?
JavaScript Date охватывает ±100 000 000 дней от 1970 года, что приблизительно соответствует годам с -271 821 до 275 760. Калькулятор обрабатывает любую историческую или далёкую будущую дату в этом диапазоне. Для дат до григорианской реформы (1582) учитывайте, что местные гражданские календари могли отличаться.
Чем вычитание двух дат отличается от прибавления отрицательного числа дней?
Ничем — вычитание N дней — это то же самое, что прибавление -N. Если нужна разница между двумя датами, используйте инструмент «Разница дат». Эта страница для одностороннего расчёта: начальная дата плюс или минус интервал.
Загружаются ли мои данные?
Нет. Расчёт выполняется в вашем браузере. Введённые данные стираются при обновлении страницы.