Два временных интервала пересекаются, если начало каждого наступает раньше окончания другого. Эта проверка учитывает и полное вложение одного интервала в другой. Вот как применить её в Numbers на Mac, чтобы сравнивать окна публикации, проверять даты и обрабатывать соприкасающиеся границы.

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

Что считается пересечением?

Сначала решите, включает ли интервал момент своего окончания. В этой статье используется интервал, включающий начало, но не включающий конец, записываемый как [start, end). Окно от 09:00 до 12:00 включает момент начала и заканчивается в полдень. Поэтому другое окно, начинающееся в 12:00, с ним не пересекается. Это соответствует правилам событий iCalendar: DTSTART включается, а DTEND — нет. RFC 5545, раздел 3.6.1.

Для двух допустимых интервалов положительной длительности полная проверка пересечения выглядит так:

A.start < B.end AND B.start < A.end

Логика проста. Два окна не пересекаются, если A заканчивается до начала B или ровно в момент его начала либо B заканчивается до начала A или ровно в момент его начала. Если ни одно из этих условий раздельности не выполняется, окна имеют общую часть. Отсюда также следует, что для проверки вложения не требуется дополнительное условие пересечения.

Рассмотрим интервал A от 09:00 до 12:00. Если интервал B длится от 08:00 до 13:00, ни одна из его границ не попадает внутрь A, но при этом B целиком включает A. Проверка, которая ищет только начало или конец B внутри A, не обнаружит этот случай. Правило с двумя сравнениями его выявляет.

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

Окно A Окно B Ожидаемый результат Причина
09:00–12:00 11:00–13:00 Пересекаются Частичное пересечение
09:00–12:00 10:00–11:00 Пересекаются A включает B
09:00–12:00 08:00–13:00 Пересекаются B включает A
09:00–12:00 09:00–12:00 Пересекаются Окна совпадают
09:00–12:00 12:00–13:00 Не пересекаются Соприкасаются только границами
09:00–12:00 13:00–14:00 Не пересекаются Между окнами есть промежуток

Настройте даты и время для сравнения в Numbers

Для окон публикации с указанным временем используйте полные даты и время. Одного значения времени на часах недостаточно, чтобы отличить сегодняшнее утро от завтрашнего. Numbers также подставляет недостающие компоненты: если ввести только время, к нему добавится сегодняшняя дата. Скрытие даты или времени меняет их отображение, но сохранённый компонент всё равно участвует в вычислениях. Форматирование дат, валют и других значений в Numbers на Mac.

Создайте таблицу с указанными ниже столбцами, отведя первую строку под заголовки:

Столбец Заголовок Назначение
A Пара Нейтральная метка для сравнения
B Начало A Начало первого окна
C Конец A Исключительная конечная граница первого окна
D Начало B Начало второго окна
E Конец B Исключительная конечная граница второго окна
F Проверка входных данных Можно ли выполнить сравнение
G Результат пересечения Ответ

Выберите ячейки ввода в столбцах B–E. На боковой панели Формат выберите Ячейка, затем установите для параметра Формат данных значение Дата и время. Выберите формат отображения, показывающий и дату, и время. Представление Интеллектуальная ячейка в нижней части окна позволяет посмотреть оба компонента выбранного значения. Инструкции Apple по форматированию даты и времени.

Для воспроизводимого первого примера введите Тестовая пара в A2 и вставьте следующие формулы в указанные ячейки. Они создадут интервал A 09:00–12:00 и интервал B 10:00–11:00 за 10 ноября 2026 года. Считайте все границы в этом примере значениями времени UTC и укажите это правило рядом с таблицей.

Ячейка Формула
B2 =DATE(2026,11,10)+DURATION(0,0,9)
C2 =DATE(2026,11,10)+DURATION(0,0,12)
D2 =DATE(2026,11,10)+DURATION(0,0,10)
E2 =DATE(2026,11,10)+DURATION(0,0,11)

Функция DATE создаёт дату из года, месяца и дня, избегая неоднозначных строк с датами. Функция DURATION принимает недели, дни и часы в качестве первых трёх аргументов, поэтому DURATION(0,0,9) задаёт девять часов. Это формулы электронной таблицы, а не команды Terminal. DATE, DURATION.

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

Проверьте окна перед поиском пересечений

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

Введите эту формулу в F2:

=IF(AND(ISDATE(B2),ISDATE(C2),ISDATE(D2),ISDATE(E2)),IF(AND(B2<C2,D2<E2),\"Ready\",\"Invalid window\"),\"Check dates\")

Внешняя проверка определяет, являются ли все границы значениями даты. Внутренняя проверяет порядок границ обоих окон. Функция ISDATE распознаёт значения даты, AND требует, чтобы все её условия выполнялись, а IF выбирает соответствующий результат. ISDATE, AND, IF.

В примере должно появиться значение Ready. Если появилось Check dates, проверьте входные ячейки, а не считайте строку записью об отдельных окнах. Если появилось Invalid window, проверьте, не совпадают ли границы, не перепутан ли их порядок и не забыли ли вы указать следующую дату. Не скрывайте ошибку формулы, пока не устраните её причину.

Найдите пересечение, в том числе при полном вложении

Введите эту формулу в G2:

=IF(F2=\"Ready\",IF(AND(B2<E2,D2<C2),\"Overlap\",\"No overlap\"),\"Check inputs\")

Для корректной строки эти два сравнения непосредственно реализуют правило пересечения: B2 — начало A, E2 — конец B, D2 — начало B, C2 — конец A. Функция AND возвращает true, только если верны оба сравнения. Документация Apple по AND.

В примере получится Overlap, поскольку B целиком помещается в A. Измените час в D2 на 8, а в E2 — на 13: результат по-прежнему должен быть Overlap, но теперь уже A помещается в B. Замените их на 12 и 13: результат должен измениться на No overlap.

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

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

Определите, какое окно включает другое

Пересечение и вложение отвечают на разные вопросы. Если нужно также определить, включает ли A целиком B, добавьте столбец H с названием A включает B и введите формулу:

=IF(F2=\"Ready\",AND(B2<=D2,E2<=C2),\"Check inputs\")

Чтобы проверить, включает ли B целиком A, добавьте столбец I и введите формулу:

=IF(F2=\"Ready\",AND(D2<=B2,C2<=E2),\"Check inputs\")

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

Разделяйте календарные даты, моменты времени, смещения и часовые пояса

Перед применением формул определите, что означают ваши входные данные. Календарная дата, например 2026-11-10, обозначает день в календаре и не задаёт часовой пояс. Она подходит для обозначения публикации на весь день. API Temporal.PlainDate от TC39 специально предназначен для моделирования таких дат независимо от часового пояса. Temporal.PlainDate.

Момент времени указывает точку на временной шкале. Смещение, например +01:00, описывает разницу с UTC в этот момент. Именованный часовой пояс, например Europe/Paris, содержит региональные правила времени. Это разные сведения: фиксированное смещение не включает меняющиеся правила именованного часового пояса. Temporal.ZonedDateTime.

Например, синтетические временные метки 2026-11-10T10:00:00+01:00 и 2026-11-10T09:00:00Z обозначают один и тот же момент времени. Если сравнивать только отображаемые часы, порядок будет определён неверно.

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

Для автоматического преобразования в документации описан такой путь через API: создать Temporal.ZonedDateTime с часовым поясом и преобразовать его с помощью toInstant(). Метод compare() упорядочивает точные моменты времени. Если местное время пропущено или повторяется при переходе на другое смещение, API предлагает явные варианты разрешения неоднозначности, включая reject. Разрешите эту неоднозначность до импорта данных для сравнения. Преобразование, сравнение и разрешение неоднозначностей в Temporal.ZonedDateTime.

Для окон на весь день работайте с календарными датами. Синтетический период публикации, охватывающий 10–12 ноября включительно, можно представить как [2026-11-10, 2026-11-13). В iCalendar конечной границей события на несколько дней также считается день после последнего включённого дня. В Numbers введите эти границы с помощью формул DATE, чтобы компоненты времени были одинаковыми. Пример многодневного события в RFC 5545.

Обрабатывайте граничные случаи, не меняя суть задачи

Для ночного интервала в конечном значении нужно указать следующую дату. Окно с 10 ноября, 23:00, до 11 ноября, 01:00, корректно. Если для обеих границ указать 10 ноября, получится обратный интервал. Исправьте дату, а не меняйте значения автоматически местами, поскольку такая замена может скрыть ошибку ввода.

Если для конкретной задачи соприкасающиеся границы должны считаться пересечением, используйте AND(B2<=E2,D2<=C2) в формуле G2. Оставьте проверку положительной длительности, если отдельно не определили, как должны обрабатываться события-точки. Это меняет правила обработки границ, поэтому укажите принятое решение рядом с таблицей.

Эти правила важны и при использовании встроенных API Mac. Согласно документации Apple, DateInterval из Foundation описывает замкнутый интервал, включающий обе границы, и допускает нулевую длительность. В нём предусмотрены intersects и intersection(with:), но его модель замкнутого интервала отличается от используемых здесь правил iCalendar. Для пересечений календарных интервалов положительной длительности применяйте явную проверку строгих границ, а не полагайтесь на то, что правило пересечения в API соответствует вашей задаче. DateInterval.

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

Источники