Dwa przedziały czasu nakładają się na siebie, gdy każdy zaczyna się przed końcem drugiego. Ten test obejmuje też pełne zawieranie się jednego przedziału w drugim. Oto jak zastosować go w Numbers na Macu, aby porównywać okna publikacji, sprawdzać poprawność dat i obsługiwać stykające się końce przedziałów.

Ten sposób pracy jest przeznaczony dla osób planujących okna publikacji w arkuszu kalkulacyjnym. Wszystkie poniższe daty i etykiety są fikcyjne. W każdym wierszu porównasz dwa okna i otrzymasz jasny wynik bez pisania programu.

Co uznajemy za nakładanie się przedziałów?

Najpierw zdecyduj, czy przedział obejmuje chwilę końcową. W tym artykule przedział obejmuje chwilę początkową, ale nie obejmuje końcowej; zapisuje się go jako [start, end). Okno od 09:00 do 12:00 obejmuje chwilę początkową i kończy się w południe. Dlatego inne okno zaczynające się o 12:00 nie nakłada się na nie. Jest to zgodne z konwencją zdarzeń w iCalendar: DTSTART jest włączne, a DTEND — niewłączne. RFC 5545, sekcja 3.6.1.

Dla dwóch prawidłowych przedziałów o dodatniej długości kompletny test nakładania się wygląda tak:

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

Rozumowanie jest proste. Dwa okna są rozłączne, jeśli A kończy się przed rozpoczęciem B lub dokładnie w chwili jego rozpoczęcia, albo jeśli B kończy się przed rozpoczęciem A lub dokładnie w chwili jego rozpoczęcia. Jeśli żaden z tych warunków rozłączności nie zachodzi, okna mają wspólny odcinek czasu. To wyjaśnia też, dlaczego do wykrycia pełnego zawierania się nie potrzeba dodatkowego warunku.

Rozważ przedział A od 09:00 do 12:00. Jeśli B trwa od 08:00 do 13:00, żaden koniec przedziału B nie przypada wewnątrz A, a mimo to B zawiera cały przedział A. Test sprawdzający tylko, czy początek lub koniec B przypada wewnątrz A, pominąłby ten przypadek. Reguła dwóch porównań go wykrywa.

Zachowaj ten fikcyjny zestaw testowy obok arkusza. Wszystkie podane niżej godziny dotyczą 10 listopada 2026 r. i używają tej samej podstawy czasu.

Okno A Okno B Oczekiwany wynik Powód
09:00–12:00 11:00–13:00 Nakładają się Częściowe przecięcie
09:00–12:00 10:00–11:00 Nakładają się A zawiera B
09:00–12:00 08:00–13:00 Nakładają się B zawiera A
09:00–12:00 09:00–12:00 Nakładają się Identyczne okna
09:00–12:00 12:00–13:00 Nie nakładają się Stykają się tylko końce
09:00–12:00 13:00–14:00 Nie nakładają się Przerwa między oknami

Ustaw w Numbers porównywalne daty i godziny

W przypadku okien publikacji określonych godzinowo używaj pełnych dat i godzin. Sama godzina nie pozwala odróżnić dzisiejszego poranka od jutrzejszego. Numbers uzupełnia też brakujące składniki: po wpisaniu samej godziny dodaje dzisiejszą datę. Ukrycie daty lub godziny zmienia jej wyświetlanie, ale zapisany składnik nadal bierze udział w obliczeniach. Formatowanie dat, walut i innych danych w Numbers na Macu.

Utwórz jedną tabelę z poniższymi kolumnami, używając pierwszego wiersza na nagłówki:

Kolumna Nagłówek Przeznaczenie
A Para Neutralna etykieta porównania
B Początek A Początek pierwszego okna
C Koniec A Wyłączny koniec pierwszego okna
D Początek B Początek drugiego okna
E Koniec B Wyłączny koniec drugiego okna
F Sprawdzenie danych Czy można wykonać porównanie
G Wynik nakładania Odpowiedź

Zaznacz komórki wejściowe w kolumnach B–E. Na pasku bocznym Format wybierz Komórka, a następnie ustaw Format danych na Data i czas. Wybierz sposób wyświetlania, który pokazuje zarówno datę, jak i godzinę. Widok Inteligentny widok komórki u dołu okna pozwala sprawdzić oba składniki zaznaczonej wartości. Instrukcje Apple dotyczące formatowania daty i godziny.

Aby uzyskać powtarzalny pierwszy przykład, wpisz Przykładowa para w komórce A2 i wprowadź poniższe formuły do wskazanych komórek. Utworzą one A jako 09:00–12:00, a B jako 10:00–11:00 w dniu 10 listopada 2026 r. Przyjmij, że wszystkie chwile końcowe w tym przykładzie podano w UTC; zapisz tę konwencję obok tabeli.

Komórka Formuła
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 tworzy datę z roku, miesiąca i dnia, unikając niejednoznacznych zapisów daty. DURATION przyjmuje tygodnie, dni i godziny jako trzy pierwsze argumenty, więc DURATION(0,0,9) podaje dziewięć godzin. Są to formuły arkusza kalkulacyjnego, a nie polecenia Terminala. DATE, DURATION.

Aby wprowadzić formułę, zaznacz komórkę docelową, wpisz =, wprowadź wyrażenie i naciśnij Return. Numbers obsługuje porównania wartości komórek i wyświetla ich wyniki logiczne. Jeśli w ustawieniach separatorem dziesiętnym jest przecinek, w argumentach funkcji używaj średników zamiast przecinków. Obliczanie wartości na podstawie danych w komórkach tabeli w Numbers na Macu, Omówienie funkcji.

Sprawdź poprawność okien przed testem nakładania

Na potrzeby tego zadania wymagaj, aby wszystkie cztery wartości daty i godziny były rozpoznawane, a koniec każdego okna przypadał ściśle po jego początku. Odwrócony przedział wymaga poprawienia. Okno publikacji o zerowej długości również wymaga osobnej decyzji, ponieważ zgodnie z przyjętą konwencją nie obejmuje żadnego czasu.

Wprowadź tę formułę w komórce F2:

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

Test zewnętrzny sprawdza, czy każdy koniec przedziału jest wartością daty. Test wewnętrzny sprawdza kolejność wartości w obu oknach. ISDATE rozpoznaje wartości daty, AND wymaga spełnienia wszystkich warunków, a IF wybiera odpowiedni wynik. ISDATE, AND, IF.

Przykład powinien zwrócić Ready. Jeśli zwróci Check dates, sprawdź komórki wejściowe zamiast traktować wiersz jako opis dwóch odrębnych okien. Jeśli zwróci Invalid window, sprawdź, czy końce przedziału nie są równe, czy wartości nie zostały wpisane w odwrotnej kolejności albo czy nie pominięto daty następnego dnia. Pozostaw błąd formuły widoczny, dopóki nie usuniesz jego przyczyny.

Wykryj nakładanie, także przy pełnym zawieraniu

Wprowadź tę formułę w komórce G2:

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

W prawidłowym wierszu oba porównania bezpośrednio realizują regułę nakładania: B2 to początek A, E2 to koniec B, D2 to początek B, a C2 to koniec A. AND zwraca prawdę tylko wtedy, gdy oba porównania są spełnione. Dokumentacja AND firmy Apple.

Przykład zwraca Overlap, ponieważ B w całości mieści się w A. Zmień godzinę w D2 na 8, a godzinę w E2 na 13; wynik nadal powinien brzmieć Overlap, tym razem dlatego, że B zawiera A. Zmień je na 12 i 13; wynik powinien zmienić się na No overlap.

Użyj wcześniejszej tabeli testowej, aby sprawdzić pozostałe przypadki. Aby wykonać kolejne porównania, wpisz następną parę w kolejnym wierszu i skopiuj do niego formuły F i G. Sprawdź skopiowane formuły, aby upewnić się, że odwołują się do nowego wiersza.

Ten układ porównuje dwa okna podane w każdym wierszu. Nie porównuje automatycznie każdego okna z osobnej listy zdarzeń ze wszystkimi pozostałymi zdarzeniami. W przypadku krótkiej listy utwórz po jednym wierszu dla każdej pary, którą chcesz sprawdzić, unikając powtórzeń tej samej pary w odwrotnej kolejności.

Ustal, które okno zawiera drugie

Nakładanie i zawieranie odpowiadają na różne pytania. Jeśli chcesz też sprawdzić, czy A w całości zawiera B, dodaj kolumnę H o nazwie A zawiera B i wprowadź:

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

Aby sprawdzić, czy B zawiera A, dodaj kolumnę I i wprowadź:

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

Te testy zawierania dopuszczają wspólne granice. Dlatego identyczne okna zwrócą TRUE w obu kolumnach. Jeśli w danym zadaniu zawieranie wymaga wolnej przestrzeni po obu stronach, zastąp oba porównania nieścisłe w odpowiedniej formule zawierania porównaniami ścisłymi. To dodatkowy warunek redakcyjny; nie zmienia wyniku testu nakładania.

Rozróżniaj daty kalendarzowe, chwile, przesunięcia i strefy

Zanim zastosujesz formuły, zdecyduj, co oznaczają dane wejściowe. Data kalendarzowa, taka jak 2026-11-10, określa dzień kalendarzowy bez wskazania strefy czasowej. Nadaje się do oznaczenia publikacji całodniowej. Interfejs API Temporal.PlainDate TC39 jawnie modeluje ten typ daty niezależnie od strefy. Temporal.PlainDate.

Chwila określa punkt na osi czasu. Przesunięcie, takie jak +01:00, opisuje różnicę względem UTC w danym momencie. Nazwana strefa, na przykład Europe/Paris, określa regionalne reguły czasu. To różne informacje: stałe przesunięcie nie zawiera zmiennych reguł przypisanych do nazwanej strefy. Temporal.ZonedDateTime.

Na przykład fikcyjne znaczniki czasu 2026-11-10T10:00:00+01:00 i 2026-11-10T09:00:00Z wskazują tę samą chwilę. Porównanie wyłącznie wyświetlonych godzin dałoby błędną kolejność.

Powyższe formuły arkusza porównują podane wartości; nie wykonują konwersji według nazwanej strefy. W przypadku okien godzinowych pochodzących z różnych stref najpierw przelicz każdą chwilę końcową na konkretny moment i wyraź wszystkie wartości końcowe w UTC. Jeśli chcesz odtworzyć zamierzony lokalny harmonogram, zachowaj osobno informacje o pierwotnych strefach.

Udokumentowana ścieżka konwersji z użyciem API polega na utworzeniu Temporal.ZonedDateTime z jego strefą i przekonwertowaniu go za pomocą toInstant(). Jego metoda compare() porządkuje dokładne chwile. Gdy lokalny czas nie występuje lub powtarza się podczas zmiany przesunięcia, API udostępnia jawne opcje rozstrzygania niejednoznaczności, w tym reject. Rozstrzygnij tę niejednoznaczność przed zaimportowaniem porównywalnych wartości. Konwersja, porównywanie i rozstrzyganie niejednoznaczności w Temporal.ZonedDateTime.

W przypadku okien całodniowych pracuj na datach kalendarzowych. Fikcyjny okres publikacji obejmujący 10–12 listopada włącznie można zapisać jako [2026-11-10, 2026-11-13). iCalendar również używa dnia po ostatnim uwzględnionym dniu jako wyłącznej daty końcowej wydarzenia całodniowego. W Numbers wprowadź te granice za pomocą formuł DATE, aby składniki czasu były spójne. Przykład wielodniowego wydarzenia z RFC 5545.

Rozstrzygnij przypadki graniczne bez zmiany pytania

W przedziale obejmującym noc trzeba podać następny dzień jako datę końcową. Okno od 10 listopada o 23:00 do 11 listopada o 01:00 jest prawidłowe. Wpisanie obu końców z datą 10 listopada odwraca przedział. Popraw datę zamiast automatycznie zamieniać wartości miejscami, ponieważ takie zamienienie mogłoby ukryć błąd we wpisie.

Jeśli w danym zadaniu stykające się końce mają być uznawane za nakładanie, użyj w formule G2 operatora AND(B2<=E2,D2<=C2). Zachowaj sprawdzanie przedziałów o dodatniej długości, chyba że osobno określono sposób obsługi zdarzeń punktowych. Ta zmiana dotyczy zasad traktowania granic i należy ją odnotować obok tabeli.

Ta zasada ma znaczenie również przy korzystaniu z natywnych interfejsów API Maca. Apple opisuje DateInterval z Foundation jako przedział domknięty, obejmujący oba końce, i dopuszcza zerowy czas trwania. Udostępnia on intersects i intersection(with:), ale jego model przedziału domkniętego różni się od konwencji iCalendar użytej w tym artykule. Przy sprawdzaniu nakładania dodatnich przedziałów kalendarzowych użyj jawnego ścisłego testu końców zamiast zakładać, że sposób wyznaczania części wspólnej w API odpowiada potrzebom zadania. DateInterval.

Przed poleganiem na wyniku porównania sprawdź trzy rzeczy: każdy koniec przedziału ma właściwą datę i podstawę czasu, oba okna mają dodatnią długość, a przykład ze stykającymi się końcami daje wybrany przez Ciebie wynik. Po jawnym ustaleniu tych zasad te same dwa porównania obsłużą częściowe nakładanie, pełne zawieranie i identyczne okna.

Źródła