Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Podział przedziału czasowego na poszczególne dni
Forum PHP.pl > Forum > Przedszkole
alex19
Mam jakiś zadany przedział czasu, np 2015-11-22 22:20:15 do 2015-11-23 02:13:11.
Teraz chciałby z takiego przedziału uzyskać dwa dla tych dni czyli
1. 2015-11-22 22:20:15 -> 2015-11-22 23:59:59
2. 2015-11-23 00:00:00 -> 2015-11-23 02:13:11

Wyciągnięcie z mojego przedziału dat to nic trudnego i w sieci jest masa przykładów, ale nie mogę nigdzie znaleźć czegoś takiego dla czasu.

Jedyne co mi się udało znaleźć to to:
  1. $start_date = '27:04:2013';
  2. $start_time = '16:30';
  3. $end_date = '29:04:2013';
  4. $end_time = '22:30';
  5.  
  6. // Date input strings and generate a suitable DatePeriod
  7. $start = DateTime::createFromFormat("d:m:Y H:i", "$start_date $start_time");
  8. $end = DateTime::createFromFormat("d:m:Y H:i", "$end_date $end_time");
  9. $interval = new DateInterval('P1D');
  10. $period = new DatePeriod($start, $interval, $end);
  11.  
  12. foreach ($period as $date) {
  13. // Get midnight at start of current day
  14. $date_start = clone $date;
  15. $date_start->modify('midnight');
  16.  
  17. // Get 23:59:59, end of current day
  18. // (moving to midnight of next day might be good too)
  19. $date_end = clone $date;
  20. $date_end->modify('23:59:59');
  21.  
  22. // Take care of partial days
  23. $date_start = max($start, $date_start);
  24. $date_end = min($end, $date_end);
  25.  
  26. // Here you would construct your array of
  27. // DateTime pairs, or DateIntervals, as you want.
  28. "%s -> %s \n",
  29. $date_start->format('Y-m-d H:i'),
  30. $date_end->format('Y-m-d H:i')
  31. );
  32. }


ale niestety to działa prawidłowo tylko jeśli w przedziale minęło więcej niż 24h sad.gif

nospor
Chodzi ci o podzielenie tego na pol? Nic prostrzego:
1) liczysz roznice miedzy koncem a poczatkiem (w sekundach)
2) Dzielisz roznice na pol
3) Wynik sekund dodajesz do pierwszego czasu
trueblue
1. Znajdź pełne dni.
2. Reszta, która zostanie będzie kawałkiem dnia od godziny startowej i/lub kawałkiem dnia do daty końcowej.
Suma powyższych to wszystkie zakresy.
alex19
Cytat(nospor @ 23.11.2015, 15:14:08 ) *
Chodzi ci o podzielenie tego na pol? Nic prostrzego:


Nie, nie na pół.

Jak będzie data od 2015-11-21 11:11:11 do 2015-11-23 21:00:01, to potrzebuję:
2015-11-21 11:11:11 - 2015-11-21 23:59:59
2015-11-22 00:00:00 - 2015-11-22 23:59:59
2015-11-23 00:00:00 - 2015-11-23 21:00:01
Tomplus
Trueblue ci podpowiedział już. Znajdź pełne dni.

a potem pobaw się datami i czasami

trueblue
A jeszcze prościej będzie chyba przeiterować od daty (bez czasu) startowej do daty końcowej (również bez czasu) i utworzyć zakres dat z godzinami od 00:00:00 do 23:59:59. Potem zmienić godzinę startową pierwszego zakresu na zakładaną i podobnie z godziną końcową ostatniego zakresu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.