Как точно рассчитать разницу между датами и количество недель

Иван Корнев·13.04.2026·4 мин

Чтобы рассчитать разницу между двумя датами, нужно вычесть одну дату из другой, получив интервал в днях, а затем при необходимости разделить результат на 7 для получения недель. Для точных расчетов в таблицах используйте функции DATEDIF (Excel) или DAYS (Google Sheets), а в программировании — встроенные библиотеки работы со временем, которые автоматически учитывают високосные годы и разную длину месяцев.

Базовые принципы расчета интервалов

Расчет временных интервалов лежит в основе планирования проектов, начисления зарплаты, логистики и аналитики. Главная сложность заключается в неравномерности календаря: месяцы имеют разное количество дней (от 28 до 31), а годы бывают високосными.

Ключевые единицы измерения:

  • Дни: Базовая единица. Разница вычисляется как простое арифметическое вычитание порядковых номеров дней.
  • Недели: Производная единица. Одна полная неделя всегда равна 7 дням.
  • Месяцы и годы: Календарные единицы. Их расчет требует учета конкретных чисел начала и конца периода, так как «месяц» — это не фиксированное число дней.

Важно: При расчете «полных недель» остаток дней отбрасывается. Например, период в 8 дней — это 1 полная неделя и 1 день, а не 1.14 недели, если задача требует целочисленного значения.

Методы вычисления разницы в днях и неделях

Самый надежный способ получить точный результат — сначала найти разницу в днях, а затем конвертировать её в нужную величину. Это исключает ошибки, связанные с разной длиной месяцев.

Ручной расчет (алгоритм)

  1. Приведите обе даты к единому формату (ГГГГ-ММ-ДД).
  2. Определите количество дней от начала эпохи (или года) для каждой даты.
  3. Вычтите меньшее значение из большего: Разница = Дата_конечная - Дата_начальная.
  4. Для получения недель разделите полученное число на 7.

Пример: Период с 15 января 2026 г. по 2 апреля 2026 г.

  • Январь: 31 - 15 = 16 дней (остаток месяца).
  • Февраль 2026 (невисокосный): 28 дней.
  • Март: 31 день.
  • Апрель: 2 дня.
  • Итого дней: 16 + 28 + 31 + 2 = 77 дней.
  • Недели: 77 / 7 = 11 полных недель.

Лайфхак для быстрой оценки: Если даты находятся в одном году, можно использовать номер дня в году (от 1 до 365/366). Разница между номерами дней даст точный интервал без сложения по месяцам.

Готовые формулы для таблиц (Excel и Google Sheets)

Электронные таблицы — самый быстрый инструмент для разовых расчетов. Используйте следующие функции:

ЗадачаФормула Excel / Google SheetsОписание
Разница в днях=B2-A2 или =РАЗНДАТ(A2;B2;"d")Простое вычитание ячеек с форматом «Дата».
Полные недели=ЦЕЛОЕ(РАЗНДАТ(A2;B2;"d")/7)Делит дни на 7 и округляет вниз до целого.
Недели и дни=ЦЕЛОЕ((B2-A2)/7) & " нед. " & ОСТАТ((B2-A2);7) & " дн."Выводит результат в читаемом формате.
Разница в месяцах=РАЗНДАТ(A2;B2;"m")Считает только полные календарные месяцы.

Где A2 — начальная дата, B2 — конечная дата.

Частая ошибка: Не перепутайте порядок аргументов в функции РАЗНДАТ (DATEDIF). Первый аргумент всегда должен быть меньшей (ранней) датой, иначе функция вернет ошибку #NUM!.

Реализация в программировании (Python и JavaScript)

При автоматизации расчетов важно использовать стандартные библиотеки, которые корректно обрабатывают часовые пояса и переходы на летнее время.

Python

Используйте модуль datetime. Оператор - возвращает объект timedelta, из которого легко извлечь дни.

from datetime import datetime

date_start = datetime(2026, 1, 15)
date_end = datetime(2026, 4, 2)

delta = date_end - date_start
days_diff = delta.days
weeks_full = days_diff // 7  # Целочисленное деление
days_remainder = days_diff % 7

print(f"Всего дней: {days_diff}")
print(f"Полных недель: {weeks_full}, остаток дней: {days_remainder}")

JavaScript

В JS даты хранятся как миллисекунды. Для получения дней нужно разделить разницу на количество миллисекунд в сутках.

const d1 = new Date('2026-01-15');
const d2 = new Date('2026-04-02');

// Разница в миллисекундах
const diffTime = Math.abs(d2 - d1);
// Перевод в дни (1000 мс * 60 сек * 60 мин * 24 часа)
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); 

const weeks = Math.floor(diffDays / 7);

console.log(`Дней: ${diffDays}, Недель: ${weeks}`);

Частые ошибки при расчетах

  1. Игнорирование високосных лет. 2024 и 2028 годы содержат 366 дней. Если период захватывает 29 февраля, ручной подсчет «по 30 дней в месяце» даст ошибку в 1-2 дня.
  2. Учет времени суток. Если в ячейке указано время (например, 15.01.2026 18:00 и 16.01.2026 09:00), простая разница даст не 1 день, а 0.625 дня. Для календарных расчетов обнуляйте время или используйте функции, игнорирующие часы.
  3. Округление недель. Деление на 7 часто дает дробное число (например, 10.5 недель). В бизнес-задачах (отпуска, аренда) обычно требуется количество полных недель (функция округления вниз), а не математическое округление.

FAQ

Как посчитать количество рабочих недель (без выходных)? Стандартные формулы считают календарные дни. Для рабочих дней в Excel используйте функцию ЧИСТРАБДНИ (NETWORKDAYS), разделите результат на 5 (рабочих дней в неделе) и округлите вниз.

Почему разница в месяцах считается неточно? Понятие «месяц» плавающее. Между 31 января и 28 февраля проходит меньше дней, чем между 1 марта и 31 марта, но в обоих случаях это «1 месяц». Функции типа DATEDIF(..., "m") считают полные календарные циклы, игнорируя реальное количество дней.

Как учесть часовой пояс при расчете? Если даты приходят из разных источников (серверы в разных странах), приведите их к единому стандарту UTC перед вычитанием. В программировании используйте библиотеки вроде pytz (Python) или moment-timezone (JS).