Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt który pokazuje wszystkie daty przez 24h
Forum PHP.pl > Forum > Gotowe rozwiązania
MlodyJNTR
Witam jestem dobry w PHP ale nie mogę jednej rzeczy ogarnąć z datą ;/ bo potrzebuje skryptu który pokazuje wszystkie daty które były przez 24h np od godziny 09:10 leciały tak 09:09, 09:08, 09:07, 09:06, 09:05, 09:04, 09:03, 09:02, 09:01, 09:00, 08:59, 08:58 .... i tak przez 24 h.
mlawnik
-1 minuta i w pętlę? tongue.gif
MlodyJNTR
tak się chyba nie da bo bo jak będzie 08:00 to już nie da rady dalej np 07:59 tylko będzie 08:-01
rocktech.pl
Witam.

Kiedyś napisałem taką funkcję:

  1. /**
  2.   * Zwraca przedzialy czasowe
  3.   * @param integer $SecondsInterval liczba sekund
  4.   *
  5.   * @return array
  6.   */
  7. function getPeriodSeries($SecondsInterval = 3600)
  8. {
  9.  
  10. $begin = new DateTime('00:00:00');
  11. $end = new DateTime('23:59:59');
  12. $ranges = array();
  13. /**
  14.   * @internal Lepiej nie kombiuj z ta funkcja tongue.gif!
  15.   * @see <http://en.wikipedia.org/wiki/ISO_8601#Time_intervals>
  16.   */
  17. $interval = new DateInterval('PT0H00M' . $SecondsInterval . 'S');
  18. $daterange = new DatePeriod($begin, $interval, $end);
  19.  
  20. foreach ( $daterange as $k => $date ) {
  21. $ranges[$k]['from'] = $date->format("H:i:s");
  22. $ranges[$k]['to'] = $date->modify('+' . $SecondsInterval - 1 . ' seconds')->format("H:i:s");
  23. }
  24. return $ranges;
  25. }


Malutkie przeróbki i dostaniesz to co chcesz.

  1. print_r(getPeriodSeries(1));
MlodyJNTR
dzięki smile.gif ale właśnie przed chwilą znalazłem i przerobiłem fajny kod i wyszło mi to
  1. for($x=0;$x<1440;$x++) {
  2. $godzina = date('H:i');
  3. $czas = date('H:i', strtotime(''.$godzina.' -'.$x.' minutes'));
  4. echo $czas;
  5. }

i działa biggrin.gif
sowiq
Kolego, pomyśl chwilkę i zoptymalizuj swój kod, bo w pętli robisz masę niepotrzebnych operacji.

Twój kod w każdej iteracji (1440 razy!) najpierw pobiera aktualny timestamp, później zamienia go na godzinę w formacie H:i, później za pomocą kosztownej funkcji strtotime zamienia to z powrotem na timestamp i znów na datę w formacie H:i. Czyli w jednej iteracji robisz 3 konwersje z tego samego na to samo.

Spróbuj tak:
1. Przed pętlą pobierasz aktualny timestamp (funkcja time) - wykona się to tylko raz
2. W każdej iteracji pętli, od zapisanego timestampu odejmujesz 60 (czyli po jednej minucie w każdej iteracji)
3. Konwertujesz timestamp na format H:i i wyświetlasz.

Będzie to o niebo szybsze i wydajniejsze. Zwracajcie uwagę na wydajność Waszych rozwiązań!
MlodyJNTR
ok zaraz przerobie smile.gif szybkość działania strony mi nie przeszkadza bo mam neta 20mb.
sowiq
Cytat(MlodyJNTR @ 10.04.2013, 11:37:39 ) *
szybkość działania strony mi nie przeszkadza bo mam neta 20mb.

Szybki internet pozwala Ci szybko ściągnąć wygenerowany na serwerze wynik działania skryptu. Ale tego jak długo będzie się to tam "mieliło", szybkość łącza nie zmieni.
MlodyJNTR
mam takie coś i mam problem po 1 data mi się wyświetla kilka razy ;/ jak zrobić aby tylko 1 raz się wyświetlała?
  1. $time = time() + (60 * 60 * 24);
  2. for($x=0;$x<1440;$x++) {
  3. $czas = $time-$x;
  4. $godzina = date('H:i', $czas);
  5. echo $godzina.', ';
  6. }
rocktech.pl
Jeszcze raz tym razem dostosowane do twoich potrzeb:

  1. /**
  2.  * Zwraca czas ...
  3.  *
  4.  * @param integer $SecondsInterval liczba sekund (min. 1 max. 3600 x 24)
  5.  *
  6.  * @return array
  7.  */
  8. function getPeriodSeries($SecondsInterval = 3600)
  9. {
  10. $begin = new DateTime('00:00:00');
  11. $end = new DateTime('23:59:59');
  12. $ranges = array();
  13. $interval = new DateInterval('PT0H00M' . $SecondsInterval . 'S');
  14. $daterange = new DatePeriod($begin, $interval, $end);
  15. foreach ( $daterange as $date ) {
  16. $ranges[] = $date->format("H:i");
  17. }
  18. return $ranges;
  19. }
  20.  
  21. print_r(getPeriodSeries(60));
mar1aczi
Cytat(MlodyJNTR @ 10.04.2013, 12:29:40 ) *
a morza tak zrobić żeby z bazy danych tylko wyświetla ostatnie 24h

Użyj w zapytaniu klauzury where
Cytat(MlodyJNTR)
a resztę usuwa?

Usuwa? w jakim celu?
sowiq
Cytat(MlodyJNTR @ 10.04.2013, 11:57:39 ) *
mam takie coś i mam problem po 1 data mi się wyświetla kilka razy ;/ jak zrobić aby tylko 1 raz się wyświetlała?

Dzieje się tak dlatego, bo funksja time() zwraca timestamp, czyli czas w sekundach. A Ty chcesz odejmować minuty, a nie sekundy.

Zrób tak:
  1. $czas = time() + (60 * 60 * 24);
  2. for($x=0;$x<1440;$x++) {
  3. $czas -= 60;
  4. [...]
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.