Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Operacje na datach, dość skomplikowane
shpaque
post 27.03.2020, 15:30:23
Post #1





Grupa: Zarejestrowani
Postów: 599
Pomógł: 1
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 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
nospor
post 27.03.2020, 15:38:43
Post #2





Grupa: Moderatorzy
Postów: 35 335
Pomógł: 5958
Dołączył: 27.12.2004




1) zajrzyj do manuala jaki parametr przyjmuje strtotime a co ty mu dajesz
2) No i najwazniejsze: masz obiekty DataTime i zamiast porownywac je to i tak nadal konwertujesz je do sekund... gdzie logika?

az korci by przeniesc na przedszkole tongue.gif

i w zasadzie 3)
Po co w ogole robisz to w php? Pobierasz z bazy wszystkie rekordy tylko po to by sprawdzic czy czas sie nie zgadza. przeciez to zarznie ci skrypt przy wiekszej ilosci rekordow. To sprawdzanie powinno sie odbyc juz w bazie


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
shpaque
post 27.03.2020, 20:42:42
Post #3





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

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


konwertuje bo juz nie wiem o co chodzi - rozlozylem warunki na czynniki pierwsze i jedno mi sie nie zgadza - zostawilem specjalnie jeden event ktory powiedzmy zaczyna sie dzisiaj o 21:00 i konczy o 21:15, ale jak w nowym dam 21:16 jako rozpoczecie - wyskakuje komunikat ze czas koliduje... Problem w tym ze daty zapisane w formacie ('Y-m-d H:i:s') nie uwzgledniaja strefy czasowej wiec wg warunku jeszcze pozostaje nasze GMT+1, ktore dopiero puszcza jak dodam godzine... W ogole to jakos jest dziwnie - ale zobacze...

@EDIT
czyli zrobilem to tak (bez strtotime, sie udalo w koncu) - mam nadzieje ze to wszystkie logiczne warunki jakie moga wystapic w glowie uzytkownika:

  1. $sessionTimeStart = new DateTime($_SESSION['test']['timeStart']);
  2. $sessionTimeEnd = new DateTime($_SESSION['test']['timeEnd']);
  3.  
  4. foreach ($testsDataBase -> test as $t) {
  5. $foreachTimeStart = new DateTime((string)$t -> timeStart);
  6. $foreachTimeEnd = new DateTime((string)$t -> timeEnd);
  7.  
  8. if ($sessionTimeStart >= $foreachTimeStart && $sessionTimeStart <= $foreachTimeEnd) {
  9. echo "<script>alert('Czas rozpoczęcia testu koliduje z innym testem!');</script>";
  10. echo "<script>history.back();</script>";
  11. }
  12. else if ($sessionTimeStart <= $foreachTimeStart && ($sessionTimeEnd >= $foreachTimeStart && $sessionTimeEnd <= $foreachTimeEnd)) {
  13. echo "<script>alert('Czas zakończenia testu koliduje z innym testem!');</script>";
  14. echo "<script>history.back();</script>";
  15. }
  16. else if ($sessionTimeStart <= $foreachTimeStart && $sessionTimeEnd >= $foreachTimeEnd) {
  17. echo "<script>alert('W tym czasie odbywa się inny test!');</script>";
  18. echo "<script>history.back();</script>";
  19. }
  20. else if ($sessionTimeEnd >= $foreachTimeStart && $sessionTimeEnd <= $foreachTimeEnd) {
  21. echo "<script>alert('Czas zakończenia testu koliduje z innym testem!');</script>";
  22. echo "<script>history.back();</script>";
  23. }
  24. }


Ten post edytował shpaque 27.03.2020, 21:31:02
Go to the top of the page
+Quote Post
vokiel
post 27.03.2020, 22:07:12
Post #4





Grupa: Zarejestrowani
Postów: 2 502
Pomógł: 423
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
Pyton_000
post 28.03.2020, 08:00:11
Post #5





Grupa: Zarejestrowani
Postów: 7 937
Pomógł: 1390
Dołączył: 26.10.2005

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


Może nie kod i nie rozwiązanie ale problem bardzo podobny. Polecam przesłuchanie i zobaczenie jak ludzie sobie radzą smile.gif

https://www.youtube.com/watch?v=3Q_oYDQ2whs
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 7.06.2020 - 07:26