Konwersja do znacznika czasu w celu porównania nie jest konieczna, biorąc pod uwagę, że ciągi są sprawdzane jako daty w formacie kanonicznym „RRRR-MM-DD”.
Ten test zadziała:
( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )
dany:
$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';
UWAGA: Porównywanie ciągów w ten sposób pozwala na „niepoprawne” daty, np. (32 grudnia) „2009-13-32” i na dziwnie sformatowane ciągi „2009/3/3”, tak że porównanie ciągów NIE będzie równoważne porównanie daty lub znacznika czasu. Działa to TYLKO wtedy, gdy wartości dat w łańcuchach są w formacie CONSISTENT i CANONICAL .
EDYTUJ, aby dodać tutaj notatkę, omawiając oczywiste.
Przez CONSISTENT rozumiem na przykład, że porównywane ciągi muszą mieć identyczny format: miesiąc musi zawsze składać się z dwóch znaków, dzień musi mieć zawsze dwa znaki, a znak separatora zawsze musi być myślnikiem. Nie możemy wiarygodnie porównywać „łańcuchów”, które nie są czteroznakowe rok, dwa znaki w miesiącu, dwa znaki na dzień. Gdybyśmy mieli na przykład kombinację jednego znaku i dwóch znaków miesięcy w łańcuchach, otrzymalibyśmy nieoczekiwany wynik podczas porównania '2009-9-30'
z '2009-10-11'
. Po ludzku postrzegamy liczbę „9” jako mniejszą niż „10”, ale porównanie ciągów będzie '2009-9'
większe niż '2009-1'
. Nie musimy koniecznie mieć znaków rozdzielających myślniki; moglibyśmy równie rzetelnie porównać ciągi znaków w'YYYYMMDD'
format; jeśli istnieje znak separatora, musi on zawsze tam być i zawsze być taki sam.
Przez CANONICAL rozumiem format, który będzie skutkował ciągami znaków, które będą sortowane według dat. Oznacza to, że ciąg będzie zawierał najpierw „rok”, potem „miesiąc”, a następnie „dzień”. Nie możemy wiarygodnie porównywać ciągów w 'MM-DD-YYYY'
formacie, ponieważ nie jest to kanoniczne. Porównanie ciągów pozwoliłoby porównać MM
(miesiąc) przed porównaniem YYYY
(rok), ponieważ porównanie ciągów działa od lewej do prawej). Dużą zaletą formatu ciągu „RRRR-MM-DD” jest to, że jest on kanoniczny; daty przedstawione w tym formacie można wiarygodnie porównać jako ciągi.
[UZUPEŁNIENIE]
Jeśli zdecydujesz się na konwersję sygnatury czasowej php, pamiętaj o ograniczeniach.
Na niektórych platformach php nie obsługuje wartości znaczników czasu wcześniejszych niż 1970-01-01 i / lub późniejszych niż 2038-01-19. (Taka jest natura 32-bitowej liczby całkowitej uniksowego znacznika czasu.) Późniejsze wersje pf php (5.3?) Mają to rozwiązać.
Strefa czasowa może również stanowić problem, jeśli nie będziesz ostrożnie używać tej samej strefy czasowej podczas konwersji z ciągu znaków na znacznik czasu iz powrotem ze znacznika czasu na ciąg.
HTH