Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Operacje na datach, dość skomplikowane
shpaque
post
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Witajcie serdecznie,
długo mnie nie było bo jednak trochę opanowałem php'a (IMG:style_emoticons/default/smile.gif) na tyle żeby nie zawracać Wam głowy, jednak stanąłem teraz na dość sprawie logicznej, mianowicie jak powinien być napisany warunek (bo konwersja daty na każdy sposób mnie już wykańcza). Najpierw opiszę przypadek:
- mamy jakiś event, który zaczyna się kiedyś i kończy - jak zabezpieczyć żeby dodając lub edytując inny - skrypt sprawdził czy się na siebie nie nałożą (datami/czasami rozpoczęcia lub zakończenia), czyli aby czas rozpoczecia nowego/edytowanego eventu nie wszedl miedzy czas roz->zak innego i czas zakonczenia nie zrobil tego samego

  1. $sessionTimeStart = new DateTime($_SESSION['test']['timeStart']);
  2. $sessionTimeStart -> format('H:i:s');
  3. $sessionTimeEnd = new DateTime($_SESSION['test']['timeEnd']);
  4. $sessionTimeEnd -> format('H:i:s');
  5.  
  6. foreach ($testsDataBase -> test as $t) {
  7. $foreachTimeStart = new DateTime((string)$t -> timeStart);
  8. $foreachTimeStart -> format('H:i:s');
  9. $foreachTimeEnd = new DateTime((string)$t -> timeEnd);
  10. $foreachTimeEnd -> format('H:i:s');
  11.  
  12. if (strtotime($sessionTimeStart) >= strtotime($foreachTimeStart) && strtotime($sessionTimeStart) < strtotime($foreachTimeEnd)) {
  13. echo "<script>alert('Czas rozpoczęcia testu koliduje z innym testem!');</script>";
  14. echo "<script>history.back();</script>";
  15. }
  16. else if ($sessionTimeEnd >= $foreachTimeStart && $sessionTimeEnd <= $foreachTimeEnd) {
  17. echo "<script>alert('Czas zakończenia testu koliduje z innym testem!');</script>";
  18. echo "<script>history.back();</script>";
  19. }
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
vokiel
post
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


Po co aż tyle warunków? Z tego co rozumiem, chcesz uniknąć kolizji, zatem:

Potraktuj to jak oś czasu
  1. /*
  2.   +------------------+
  3.   | istniejący event |
  4.   +------------------+
  5. ------------------------------------------------->
  6. +----+ +----+ +----+ +----+ +----+
  7. | 1 | | 2 | | 3 | | 4 | | 5 |
  8. +----+ +----+ +----+ +----+ +----+
  9. */



Teoretycznie masz 5 możliwości
1. Twój jest przed istniejącym
2. Zachodzi na początek istniejącego
3. Zawiera się w istniejącym
4. Zachodzi na koniec istniejącego
5. Jest później od istniejącego

Ale, tak na prawdę sprowadza się to do trzech przypadków:
1. Jest całkowicie przed
2-4. Koliduje
5. Jest całkowicie po

1. Sprawdzasz zwyczajnie czas zakończenia nowego <= czas rozpoczęcia istniejącego
5. Czas rozpoczęcia nowego >= czas zakończenia poprzedniego
2-4. Pozostałe

Ten post edytował vokiel 27.03.2020, 22:55:13
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 10:57