2013-07-18 14 views
5

Próbuję ustalić, czy DateTime dokładnie pokrywa się z możliwym pojawieniem się DateInterval. Odstępy, których używam, muszą uwzględniać specyfikacje formatu typu "N-ty dzień od następnego miesiąca" i nie jestem pewien, czy jest to możliwe, biorąc pod uwagę te warunki.php - ustal, czy DateTime przypada na DateInterval

Moim podstawowym założeniem było odwrócić DateInterval, stosuje się go do klonem oryginalnej DateTime, umieścić go z powrotem jak było zastosować ponownie, a następnie sprawdzić, czy te dwie DateTime przypadki były równe. Jeśli tak, to pojawia się dokładnie w przedziale:

public static function dateFallsOnPeriod(DateTime $date, DateInterval $interval) 
{ 
    $compare = clone $date; 

    // invert the period, apply it to the date, uninvert & then reapply 
    $interval->invert = 1; 
    $compare->add($interval); 
    $interval->invert = 0; 
    $compare->add($interval); 

    return $date == $compare; 
} 

To wydawało się zastosowanie odstępu dwa razy w tym samym kierunku, a więc spróbowałem ponownie stosując ->sub() i ->add(), w wyniku błędu krytycznego „DateTime :: sub (): Obsługiwane są tylko niezwiązane ze specyfikacją specyfikacje czasu względnego dla odejmowania ". Wygląda na to, że tego rodzaju funkcjonalność nie jest w ogóle zaimplementowana.

Czy ktoś ma lepsze pomysły, zamiast brzydkiego & nieskuteczne rozwiązanie doboru offset dobrze za datę rozpoczęcia i iteracji do przodu, dopóki nie dopasował go lub minął?

z góry dzięki!

+1

'invert' wykonuje sub i przetestował go. twój okręt podwodny i dodaj się wzajemnie zlikwiduj. mówi, że sprawdzanie, czy $ porównać == $ datę na początku – DevZer0

+0

Czy możesz wyjaśnić pytanie na przykładzie? Co mnie myli, to że nazwa funkcji wskazuje, że chcesz sprawdzić, czy okres pokrywa się z datą, ale przekazujesz do swojej funkcji DateTime i DateInteral, zamiast - jak przypuszczam - DateTime i DatePeriod? – luttkens

+0

Domyślam się, że metoda powinna nazywać się "dateCoincidesWithInterval" lub czymś, przepraszam za to. @ DevZer0: Powód dodawania, odejmowania i porównywania nie zawsze się eliminuje, wynika z tych specjalnych odstępów, które pozwala na to PHP. Jeśli więc twój przedział określał "pierwszą niedzielę miesiąca", a minąłeś poniedziałek jako "$ date", chciałbyś wiedzieć, że ta pierwsza data nie pasuje do przedziału. Aby uzyskać więcej normalnych odstępów czasu, to, co mówisz, jest prawdą, a metoda nie jest naprawdę potrzebna, ale chcę omówić każdą możliwość z tą. – pospi

Odpowiedz

0

Jedną z możliwości jest wygenerowanie uniksowych znaczników czasu z datetime i porównanie wartości całkowitych.

0

Zgadzam się z tuxnani, o wiele łatwiej jest przekonwertować wszystkie daty na format unix z strtotime(), a następnie po prostu porównać wartości liczbowe z większą lub mniejszą liczbą operacji.

Powiązane problemy