Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: datediff z pominięciem przedziału czasowego
Forum PHP.pl > Forum > PHP
Kishin
Witam,

Potrzebuje policzyć róznice w czasie pomiędzy dwoma datami, jakąś wprowadzoną przez użytkowania i teraźniejszą.
Jednak czas niema się liczyć w przedziale 22:00 do 07:00

  1. function datediff( $date1, $date2 )
  2. {
  3. $diff = abs( strtotime( $date1 ) - strtotime( $date2 ) );
  4.  
  5. return sprintf
  6. (
  7. "%d dni, %d godziny , %d minuty, %d sekundy",
  8. intval( $diff / 86400 ),
  9. intval( ( $diff % 86400 ) / 3600),
  10. intval( ( $diff / 60 ) % 60 ),
  11. intval( $diff % 60 )
  12. );
  13. }
  14.  
  15. echo datediff( $create_date, "now" ) . "\n";


tak licze sobie różnice, ale jak zrobić aby nie liczył konkretnego przedziału nie bardzo mam pomysł.
Ktoś pomoże?
Crozin
Liczysz trzy wartości, których suma będzie odpowiedzią:
1. Ile sekund jest pomiędzy $create_date, a godziną 22 dnia wskazywanego przez $create_date.
2. Ile pełnych dni jest pomiędzy $create_date, a chwilą obecną. Liczbę tę mnożysz przez 54000 (ilość sekund pomiędzy 07:00, a 22:00).
3. Ile sekund jest pomiędzy 07:00 dnia dzisiejszego, a aktualną godziną.
SmokAnalog
Zanim zaczniemy rozwiązywać ten problem, zastanów się czy to ma sens. Dla uproszczenia przykładu załóżmy, że przedział wyłączony to 00:00 - 06:00. Wtedy różnicę 4 dni pokażemy jako "3 dni". Jaki w tym sens? Kto się w tym połapie?
Pyton_000
Zapewne chodzi o roboczogodziny
Kishin
Cytat(Crozin @ 29.07.2014, 09:39:32 ) *
Liczysz trzy wartości, których suma będzie odpowiedzią:
1. Ile sekund jest pomiędzy $create_date, a godziną 22 dnia wskazywanego przez $create_date.
2. Ile pełnych dni jest pomiędzy $create_date, a chwilą obecną. Liczbę tę mnożysz przez 54000 (ilość sekund pomiędzy 07:00, a 22:00).
3. Ile sekund jest pomiędzy 07:00 dnia dzisiejszego, a aktualną godziną.


coś takiego wydaje się działać:

  1. function datediff( $date1, $date2 )
  2. {
  3. $diff = abs( strtotime( $date1 ) - strtotime( $date2 ) );
  4. //Ile sekund jest pomiędzy $create_date, a godziną 22 dnia wskazywanego przez $create_date.
  5. $diffnoc=strtotime( $date2 )-(strtotime(date('Y-m-d'))+79200);
  6. if($diffnoc>0)
  7. $diff=$diff-$diffnoc;
  8. //Ile pełnych dni jest pomiędzy $create_date, a chwilą obecną
  9. $diffdays=round(abs(strtotime($date1)-strtotime($date2))/86400)*32400;
  10. if($diffdays>0)
  11. $diff=$diff-$diffdays;
  12.  
  13.  
  14.  
  15. return sprintf
  16. (
  17. "%d dni, %d godziny , %d minuty, %d sekundy",
  18. intval( $diff / 86400 ),
  19. intval( ( $diff % 86400 ) / 3600),
  20. intval( ( $diff / 60 ) % 60 ),
  21. intval( $diff % 60 )
  22. );
  23. }
  24.  
  25. echo datediff( $create_date, "now" ) . "\n";



Powiedz mi tylko po co 3 punkt? ten czas jest liczony przy odejmowaniu dwóch głównych dat wiec wydaje się zbędne.
Przy okazji miedzy 22:00 a 07:00 jest 32400 sekund a nie 54000 smile.gif
W każdym razie dzięki za pomoc.


Cytat(SmokAnalog @ 29.07.2014, 09:40:44 ) *
Zanim zaczniemy rozwiązywać ten problem, zastanów się czy to ma sens. Dla uproszczenia przykładu załóżmy, że przedział wyłączony to 00:00 - 06:00. Wtedy różnicę 4 dni pokażemy jako "3 dni". Jaki w tym sens? Kto się w tym połapie?


Tak jak poniżej napisał Pyton_000 chodzi o roboczogodziny, czas jest liczony na realizacje zlecenia a ten nie jest liczony w przedziale 22:00-07:00 wink.gif


SmokAnalog
To nie lepiej pokazać go jako sumę godzin? Nie jestem przekonany do nazywania X godzin dniami, kiedy X <> 24.
Crozin
1. Punkt trzeci jest potrzebny jeżeli potrzebujesz dokładności "co do godziny", nie "co do dnia" - w drugim przypadku faktycznie będzie zbędny.
2. Przedziały 0700 - 2200 i 2200 - 0700 trochę się różnią. wink.gif
Kishin
Cytat(SmokAnalog @ 29.07.2014, 12:04:25 ) *
To nie lepiej pokazać go jako sumę godzin? Nie jestem przekonany do nazywania X godzin dniami, kiedy X <> 24.

W sumie racja, tak będzie chyba bardziej czytelnie, dzięki za sugestie.


Cytat(Crozin @ 29.07.2014, 12:07:27 ) *
1. Punkt trzeci jest potrzebny jeżeli potrzebujesz dokładności "co do godziny", nie "co do dnia" - w drugim przypadku faktycznie będzie zbędny.
2. Przedziały 0700 - 2200 i 2200 - 0700 trochę się różnią. wink.gif

1.Mam dokładność co do godziny i bez pkt trzeciego smile.gif.
2. A ja gdzies pisałem o przedziale 07-22? biggrin.gif

w każdym razie mam to o co mi chodziło.
Jeszcze raz dzięki za pomoc.

Pozdrawiam
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.