Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Sumowanie czasu hh:mm + hh:mm
Forum PHP.pl > Forum > PHP
foxmark
Witam,

Zanim napisalem post przeszukalem forum ale nie udalo mi sie nic znalesc (przepraszam jesli cos przeoczylem)
Pisze maly skrypt ktory co tydzien zbiera czas pracownikow - kazdy wypelnia deklaracje.
Wiec co tydzien dostaje 7 wartosci hh:mm np w poniedzialek czas pracy 08:32 (8 godzin i 32 minuty)
Jakiej funkcji uzyc zeby policzyc calkowity czas pracy w danym okresie?
chcialbym dodac czas1 + czas2 + czas3 itd.... czy musze wszystko konwetowac do sekund dokonywac obliczen a potem ponownie przeliczac
Jak sie za to zabrac?

Pozdrawiam
I dziekuje za poswiecony mi czas.
abort
Zapytam się Ciebie: a gdybyś musiał ręcznie to zrobić, to jak byś to załatwił? Tak, żeby było szybko i optymalnie.
Bo ja bym dla każdego pracownika sumował w ten sposób, że robię sumę godzin i sumę minut.
A potem - wiadomo, przekształcenie np. 453 minut na format "ileś godzin i minut" - ale to już mam nadzieję dla Ciebie nie jest problemem.
foxmark
Recznie ... hmmmm chyba tak:

np. 1:30 + 2:00 daja 3:30 min pracy

1:30 rozbijam na 1*60*60 + 30*60 + 2*60*60 = 3600 + 1800 + 7200 = 12600/60/60 = 3.5


Logicznie?

ale jak teraz 3.5 zamienic na 3:30 min
jesli pytam o czas w formacie hh:mm to musze podac wynik w formacie hh:mm a nie hh:dziesietne czesci godziny.
by_ikar
Możesz sumować już po stronie bazy danych wtedy to jest kwestia jednego zapytania i od razu masz gotowy wynik. Możesz pobrać dane z bazy wykonać jakąś funkcję zwrotną na tablicy i przerobić czas z hh:mm na hh.mm i rzutować do float a następnie zsumować całą tablicę. Możesz pobawić się obiektem datetime. Ogólnie możliwości dość sporo. Najbardziej poprawnym politycznie i zarazem najłatwiejszym będzie sumowanie po stronie bazy wink.gif
Micchaleq
moim zdaniem jeżeli chcemy wykorzystać php to najprościej jak kolega wyżej napisał

suma minut ( jeżeli więcej niż 60 to /60 )
dodajemy do godzin i tutaj zamyka się sprawa.

A jeżeli masz dane w postaci od której do której pracował pracownik to tutaj trzeba się pobawić z funkcją strtotime() wtedy jestes w stanie wyliczyć ile h pracował i korzystając z tego co napisałem wyżej można sobie to policzyć
foxmark
Witam Ponownie,

Mam funkcje:

  1. function timeToMin($time) {
  2. sscanf($time, "%d:%d", $hours, $minutes);
  3. $time = $hours * 60 + $minutes;
  4. return $time;
  5. }


zmieniam czas postaci np: 02:55 na:

  1. $time1 = timeToMin($value[1]);


pod koniec podliczam sume zwyczajnie:

  1. $total = $time1 + $time2 + $time3 + $time4 + $time5 + $time6 + $time7;
  2. $total = $total/60;


ale otrzymuje wynik typu: 4.6666666666667
jak mam to zamienic ponownie na postac HH:mm questionmark.gif

Oczywiscie moge funkcje zmodyfikowac i obliczac sekundy
uzyc:
  1. echo date("H:i", $total);

i niby sprawa rowiazana ale jesli mam wiecej niz 24h przepracowane co w normalnym tygodniu pracy jest raczej normalne normalne to dostaje 00:00 zamiast np 40:05 sad.gif


Pozdrawiam
Pawel_W
oj, ludzie, ludzie...

  1. $time1 = explode(':', '1:23');
  2. $time2 = explode(':', '2:58');
  3.  
  4. $total = $time1[1] + $time2[1] + ($time1[0] + $time2[0]) * 60;
  5.  
  6. echo floor($total/60) . ':' . $total%60;
abort
Cytat(foxmark @ 15.11.2011, 15:11:18 ) *
ale otrzymuje wynik typu: 4.6666666666667
jak mam to zamienic ponownie na postac HH:mm questionmark.gif


Ja przepraszam, że zadam publicznie niedyskretne pytanie, ale... czy tylko mnie takich rzeczy uczono w podstawówce?
by_ikar
Eh, czemu nie chcesz obliczyć tego w bazie danych?
foxmark
Cytat(by_ikar @ 15.11.2011, 16:40:11 ) *
Eh, czemu nie chcesz obliczyć tego w bazie danych?


Zanim zapisze rekordy w DB zbieram je i trzymam w sesji w tym miejscu wyswietlam je i jesli uzytkownik sie zgadza i wszystko jest ok
klika zapisz i wszystko ladowane jest do bazy danych.

Dodam tylko ze znalazlem taki kod:
  1. function m2h($mins) {
  2. if ($mins < 0) {
  3. $min = Abs($mins);
  4. } else {
  5. $min = $mins;
  6. }
  7. $H = Floor($min / 60);
  8. $M = ($min - ($H * 60)) / 100;
  9. $hours = $H + $M;
  10. if ($mins < 0) {
  11. $hours = $hours * (-1);
  12. }
  13. $expl = explode(".", $hours);
  14. $H = $expl[0];
  15. if (empty($expl[1])) {
  16. $expl[1] = 00;
  17. }
  18. $M = $expl[1];
  19. if (strlen($M) < 2) {
  20. $M = $M . 0;
  21. }
  22. $hours = $H . "." . $M;
  23. return $hours;
  24. }


Zamienia ilosc minut na godziny i minuty.
Szkoda tylko ze tyle lini zeby obliczyc banalna rzecz i ze nie moglem sam do tego dojsc - no ale praca wykonanan i pora do domu smile.gif
Pozdrawiam!
Pawel_W
Cytat(foxmark @ 15.11.2011, 17:56:29 ) *
Szkoda tylko ze tyle lini zeby obliczyc banalna rzecz

bez obrazy, ale to pisał jakiś laik, można o połowę krócej wink.gif
Bags_Bunny
  1. function m2h($min)
  2. {
  3. $sign = $min < 0 ? '-' : '';
  4. $min = abs($min);
  5. return $sign.floor($min/60).':'.str_pad($min%60, 2, '0', STR_PAD_LEFT);
  6. }

Chodzi o coś takiego? Bo aż smutno mi się zrobiło jak tamten kod zobaczyłem wink.gif.
foxmark
Cytat(Bags_Bunny @ 15.11.2011, 18:23:26 ) *
  1. function m2h($min)
  2. {
  3. $sign = $min < 0 ? '-' : '';
  4. $min = abs($min);
  5. return $sign.floor($min/60).':'.str_pad($min%60, 2, '0', STR_PAD_LEFT);
  6. }

Chodzi o coś takiego? Bo aż smutno mi się zrobiło jak tamten kod zobaczyłem wink.gif.



Tak dziala super, wielkie dzieki za pomoc i poswiecony czas.
Przepraszam jesli moje pytania wydaly sie banalne ale kazdy sie kiedys uczy smile.gif
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.