Чтобы выразить разницу между датами в календарных годах, месяцах и днях, сначала посчитайте календарные месяцы, а затем оставшиеся дни. В этом пошаговом руководстве по Numbers используются условные даты публикации и явно заданное правило для конца месяца, чтобы вы могли проверить результат.

Например, согласно описанному ниже методу, период с 18 мая 2022 года по 24 сентября 2025 года составляет 3 года, 4 месяца и 6 дней. Вы создадите универсальную электронную таблицу, которая также учитывает февраль, високосные годы и даты вроде 31 января.

Определите, что считать календарной разницей

Для вычисления календарной разницы нужна начальная дата и правило перехода между месяцами. Деление прошедших дней на 365, а затем на 30 не позволяет сохранить календарные границы: месяцы и годы имеют разную продолжительность. В документации по API дат TC39 это различие объясняется явно: по умолчанию разница дат выражается в днях, если не запрошена более крупная единица. Документация по Temporal.PlainDate.

В этом руководстве для современных дат григорианского календаря используется следующее соглашение:

  1. Двигайтесь от более ранней даты к более поздней.
  2. Найдите наибольшее целое смещение в месяцах, при котором календарная опорная дата не выходит за конечную дату.
  3. Сохраняйте номер дня начальной даты, если он есть в целевом месяце; в противном случае используйте последний день этого месяца.
  4. Каждые 12 месяцев считайте одним годом, а затем посчитайте дни от опорной даты до конечной даты.

Согласно этому соглашению, период с 31 января по 28 февраля 2025 года составляет один месяц. Период с 31 января по 30 марта 2025 года составляет один месяц и 30 дней: опорная дата через два месяца пришлась бы на 31 марта, то есть была бы позже конечной даты. Это следствия выбранного правила, а не универсальные определения месяца.

Используйте подсчёт прошедших дней, а не включайте в подсчёт оба граничных дня. Поэтому для одинаковых дат результат составит ноль лет, ноль месяцев и ноль дней. Если вам нужно подсчитать количество датированных календарных записей, попадающих в диапазон, это другая операция.

Отделяйте календарные даты от меток времени

Дата публикации, например 2025-09-24, — это календарная дата: год, месяц и день. Она не указывает время суток и не обозначает конкретный момент времени. Метка времени, например 2025-09-24T00:30:00+02:00, включает время и числовое смещение UTC, поэтому позволяет определить конкретный момент. RFC 3339 определяет соответствующий синтаксис полной даты и даты со временем. RFC 3339: Дата и время в Интернете: метки времени.

Смещение, например +02:00, описывает отношение ко всемирному координированному времени (UTC). Именованная часовая зона, например Europe/Paris, задаёт правила преобразования между моментами времени и местным временем; применимое смещение может меняться. RFC 9557 различает эти понятия и объясняет, почему одного смещения недостаточно для правил календарных вычислений по местному времени. RFC 9557: Дата и время в Интернете: метки времени с дополнительной информацией.

Для этой таблицы вводите непосредственно предполагаемые даты публикации. Если в источнике указаны метки времени, сначала определите, какая именованная часовая зона задаёт день публикации, и преобразуйте обе метки в даты в этой зоне. Например, 2025-09-24T00:30:00+02:00 — это тот же момент, что и 2025-09-23T22:30:00Z; выбор отображаемой даты до определения часовой зоны отсчёта может изменить входные данные на один день.

Создайте таблицу для вычисления разницы дат в Numbers

Вам понадобится Numbers на Mac и таблица со столбцами A–J как минимум с двумя строками. Используйте строку 1 для заголовков, а строку 2 — для вычислений. В приведённых формулах используются английские названия функций и запятые в качестве разделителей.

Чтобы ввести формулу, выберите целевую ячейку, введите или вставьте формулу, начинающуюся с =, и нажмите Return. Apple указывает, что при вводе знака равенства открывается Редактор формул, а справка по функциям доступна в Браузере функций. Вычисление значений с использованием данных в ячейках таблицы в Numbers на Mac.

Введите однозначные начальную и конечную даты

Задайте для A1 заголовок Начальная дата, а для B1 — Конечная дата. Введите следующие условные даты публикации:

Ячейка Формула Предполагаемая дата
A2 =DATE(2022,5,18) 18 мая 2022 года
B2 =DATE(2025,9,24) 24 сентября 2025 года

Функция DATE(year,month,day) позволяет избежать неоднозначности при региональной интерпретации строк дат. Apple специально рекомендует эту функцию для единообразной интерпретации дат при разных региональных настройках. Указывайте корректные календарные даты, в том числе правильное количество дней в каждом месяце. DATE.

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

Найдите последнюю календарную опорную дату перед конечной датой

Введите следующие заголовки и формулы во второй строке по порядку:

Ячейка Заголовок в строке 1 Формула в строке 2
C2 Возможное количество месяцев =(YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)
D2 Полные месяцы =C2-IF(DATE(YEAR(B2),MONTH(B2),MIN(DAY(A2),DAY(EOMONTH(B2,0))))>B2,1,0)
E2 Начало опорного месяца =EDATE(DATE(YEAR(A2),MONTH(A2),1),D2)
F2 Опорная дата =DATE(YEAR(E2),MONTH(E2),MIN(DAY(A2),DAY(EOMONTH(E2,0))))

Первая формула вычисляет разницу между позициями года и месяца. Функции Apple YEAR и MONTH извлекают эти компоненты из значений дат. YEAR, MONTH.

Вторая формула проверяет опорную дату в конечном месяце. Её день — это меньшее из числа начального дня и последнего дня этого месяца. Если эта возможная дата выходит за конечную дату, формула уменьшает количество месяцев на один. Эта условная корректировка использует документированное поведение функции IF. IF.

Оставшиеся формулы вычисляют саму опорную дату. Функция EDATE смещает первый день начального месяца на вычисленное количество месяцев, позволяя избежать недопустимого дня на этом промежуточном шаге. EDATE.

Затем таблица явно применяет правило конца месяца: функция DAY извлекает номер дня, EOMONTH возвращает последнюю дату целевого месяца, а MIN выбирает меньшее из чисел. Благодаря этому формула явно показывает, как обрабатываются короткие месяцы. DAY, EOMONTH, MIN.

Выразите результат в годах, месяцах и днях

Завершите таблицу, добавив следующие формулы:

Ячейка Заголовок в строке 1 Формула в строке 2
G2 Годы =QUOTIENT(D2,12)
H2 Месяцы =MOD(D2,12)
I2 Дни =DATEDIF(F2,B2,"D")
J2 Календарная разница =G2&" years, "&H2&" months, "&I2&" days"

Функция QUOTIENT возвращает результат целочисленного деления, а MOD — остаток, преобразуя количество полных месяцев в годы и оставшиеся месяцы. QUOTIENT, MOD.

Для примера с указанными датами D2 должно быть равно 40, а F2 должно соответствовать 18 сентября 2025 года. Шесть дней от этой опорной даты до 24 сентября дают итог: 3 года, 4 месяца, 6 дней. Текстовая формула использует неизменные формы множественного числа для простоты; отдельные числовые столбцы можно применять в других вычислениях.

Проверьте последние дни месяцев и високосные годы

Используйте эти условные пары дат, чтобы проверить соглашение, принятое в таблице. Замените только формулы в A2 и B2, сохранив остальные формулы:

Начальная дата Конечная дата Ожидаемый результат: годы, месяцы, дни Опорная дата
18 мая 2022 года 24 сентября 2025 года 3, 4, 6 18 сентября 2025 года
31 января 2025 года 28 февраля 2025 года 0, 1, 0 28 февраля 2025 года
31 января 2024 года 29 февраля 2024 года 0, 1, 0 29 февраля 2024 года
29 февраля 2024 года 28 февраля 2025 года 1, 0, 0 28 февраля 2025 года
31 января 2025 года 30 марта 2025 года 0, 1, 30 28 февраля 2025 года
24 сентября 2025 года 24 сентября 2025 года 0, 0, 0 24 сентября 2025 года

Это вычисленные примеры, соответствующие указанному правилу. Базовый алгоритм вычисления опорной даты был проверен детерминированным расчётом на Python, в том числе для 10 000 сгенерированных пар дат; сам интерфейс Numbers не запускался.

Проверьте результат, восстановив путь вычисления: возьмите исходную начальную дату, прибавьте общее количество месяцев из D2 согласно указанному правилу конца месяца, а затем прибавьте количество дней из I2. Вы должны получить конечную дату. Всегда вычисляйте опорный месяц от исходной начальной даты: последовательное прибавление по одному месяцу может привести к потере исходного номера дня после февраля.

Почему нельзя просто объединить результаты трёх функций DATEDIF?

Apple документирует варианты DATEDIF для вычисления лет, месяцев без учёта лет и дней без учёта месяцев и лет. Вариант \"MD\" применяет конкретный расчёт номера дня с подставленными месяцами. Поэтому не следует считать, что он означает количество дней, оставшихся после выбранной вами корректировки на конец месяца. В этой таблице вариант \"D\" используется только между явной опорной и конечной датами. DATEDIF.

Соответствие операции API для работы с датами

Для программной реализации этой задачи TC39 документирует тип даты без времени Temporal.PlainDate и операцию вычисления разницы с учётом календаря. Запрос until с параметром largestUnit: 'year' возвращает длительность, выраженную в годах и более мелких единицах; при значениях параметров по умолчанию разница вычисляется в днях. В документации также описывается ограничение при прибавлении месяцев и указано, что разница между датами в разных календарных системах не вычисляется, если сначала не преобразовать их к общему календарю. Документация по Temporal.PlainDate.

Выбор такого API подтверждает основные решения, необходимые для таблицы: определить, что входные данные представляют собой даты без времени, выбрать календарь, задать наибольшую единицу и сохранить опорную дату для интерпретации месяцев. Стандарты строк дат описывают формат представления; сам по себе выбор формата не определяет правило конца месяца для вашей задачи.

Разберитесь с неожиданным результатом до использования

Если формула выдаёт ошибку, выберите индикатор ошибки, чтобы прочитать сообщение; в руководстве Apple по Numbers описан этот способ диагностики. Проверьте ссылки на ячейки и воспользуйтесь Браузером функций, чтобы вставить аргументы, если в вашей версии требуются другие разделители формул. Вычисление значений с использованием данных в ячейках таблицы в Numbers на Mac.

Если результат выглядит правдоподобно, но отличается от результата другого инструмента, сравните правило конца месяца в нём с правилом этой таблицы. Также проверьте, не учитывает ли другой инструмент оба граничных дня, использует ли он метки времени вместо календарных дат и не округляет ли результат. Не подставляйте ноль вместо ошибок: исключите из этого расчёта для прямого порядка дат обратные даты и пустые значения.

Для многократного сравнения дат публикации сохраните рядом с итоговой формулировкой начальную дату, конечную дату и опорную дату. Вместе они позволят проверить, как календарный расчёт привёл к результату вроде «3 года, 4 месяца, 6 дней».

Источники