Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Przeliczenie czasu z godzin na minuty
Forum PHP.pl > Forum > Przedszkole
primo
Witam,

dumam, dumam i nie mogę wydumać, jak przeliczyć czas wpisany w formacie 3:12:30 na minuty, czyli 192,30 questionmark.gif
devnul
ooo tu piszą o tym jak zamienić na sekundy wybraną date (a te na minuty/godziny itd już przeliczyć umiemy prawda)

ew zapoznaj się z właściwościami funckji explode i dalej już chyba wiesz jak mnożyć i dzielić winksmiley.jpg

//edit:
a niech strace:

  1. <?php
  2. $godz='3:12:30';
  3. $g=explode(':',$godz);
  4. echo round(($g[0]*3600+$g[1]*60+$g[2])/60,2);
  5. ?>
primo
Cytat(devnul @ 2.04.2007, 00:20:55 ) *
ooo tu piszą o tym jak zamienić na sekundy wybraną date (a te na minuty/godziny itd już przeliczyć umiemy prawda)

ew zapoznaj się z właściwościami funckji explode i dalej już chyba wiesz jak mnożyć i dzielić winksmiley.jpg

//edit:
a niech strace:

  1. <?php
  2. $godz='3:12:30';
  3. $g=explode(':',$godz);
  4. echo round(($g[0]*3600+$g[1]*60+$g[2])/60,2);
  5. ?>


Nie do końca precyzyjnie określiłem swój problem. Stąd też Wy nie do końca dobrze mnie zrozumieliście. Tak rozwiązałem swój problem. Ciekawe czy można było to rozwiązać prościej. Ostatnio zwracam uwagę, aby nie tylko kod działał, ale był maksymalnie zoptymalizowany i prosty w swoich założeniach. Rzućcie no okiem na to:
  1. <?php
  2. public function maraton (){
  3.  
  4. $mnoznik = $this->_V * 1000;
  5. $tablica = explode (".",$mnoznik);
  6. $minuty = $tablica[0];
  7. echo "<br>$minuty";
  8.  
  9. $sekundy = ($tablica[1]*60)/10;
  10. $sekundy = substr($sekundy, 0, strlen($sekundy) - 12);
  11. if ($sekundy == 0)
  12. $sekundy = "00";
  13.  
  14. echo "<br>$sekundy<br>";
  15.  
  16. $result = array($minuty, $sekundy);
  17. $wynik_w_min_na_km = implode(":", $result);
  18. echo "<br>$wynik_w_min_na_km min/km";
  19. }
  20. ?>


Wynik jaki tu uzyskuję to np. 4:10 min/km. Chcę teraz te 4:10 przemnożyć przez 42,195m i zobaczyć wynik mnożenia co 1 kilometr. Małym problemem jest przemnożyć minuty razy 2,3,4,5,6... 42, ale jak wykonać zliczanie sekund, gdy przekroczą 60 questionmark.gif
devnul
szczerze mówiąc to kompletnie nic nie rozumiem z tego co tu wstawiłeś - dałeś fragment klasy która odwółuje się do zmiennej $_V a czort wie czym ona jest :|
primo
Cytat(devnul @ 2.04.2007, 19:28:05 ) *
szczerze mówiąc to kompletnie nic nie rozumiem z tego co tu wstawiłeś - dałeś fragment klasy która odwółuje się do zmiennej $_V a czort wie czym ona jest :|

  1. <?php
  2. /** Dystans na jakim odbywa się bieg **/
  3. private $_Distance;
  4.  
  5. /** Rezultat jaki chce uzyskać na danym dystansie **/
  6. private $_Result;
  7.  
  8. /** Prędkość uzyskana z podzielenia dystansu przez wynik **/
  9. private $_V;
  10.  
  11. public function __construct ($dist, $wynik) {
  12.  
  13. $this->_Distance = $dist;
  14. $this->_Result  = $wynik;
  15. $this->_V = $wynik / $dist;
  16. }
  17. ?>
devnul
więc powtórze jeszcze raz: licz na sekundach a później z nich przeliczaj na wyższe jednostki a unikniesz problemów. poza tym nadal nie rozumiem co próbujesz osiągnąć :|

opisz może w krokach co chcesz zrobić (dokładnie)
primo
Cytat(devnul @ 2.04.2007, 19:43:47 ) *
więc powtórze jeszcze raz: licz na sekundach a później z nich przeliczaj na wyższe jednostki a unikniesz problemów. poza tym nadal nie rozumiem co próbujesz osiągnąć :|

opisz może w krokach co chcesz zrobić (dokładnie)



OK.

Mam sobie formularz: http://www.treningbiegacza.pl/index.php?op=16 - który ma dwa pola: dystans i czas (docelowo dystans będzie polem wyboru, aby nie było dodatkowej roboty z przeliczaniem różnych zapisów jednostek metrycznych np. 42195m to to samo co 42,195). Ważnym jest natomiast zapis czasu, ponieważ użytkownik może móc wpisać, że na dystansie maratonu uzyskał 3:10:00, ale również może wpisać 190, to jednak pół biedy bo gdy zechce zapisać w takiej postaci 190:10 (3:10:10) - chcę to jakoś znormalizować, ale nic mi do głowy nie przychodzi.
Generalnie mogę zmusić do wklepywania takiego formatu jaki mi będzie odpowiadał, ale fajnie byłoby wymyślić kod, który obsłuży każdy wpis smile.gif Celem końcowym jednak jest, aby przelicznik który mi wyjdzie np. 42195m/3:00:00 = 4:15 min/km ---- teraz chcę ten czas przemnożyć przez 42 i 195m, czyli:
1km 4:15
2km 8:30
3km 12:45 itd. --- mieć po prostu wyliczone jaki czas powienienem mieć na poszczególnych kilometrach.

Mam nadzieję, że co nieco rozjaśniłem questionmark.gif
devnul
odrazu lepiej winksmiley.jpg

to może pokoleji:
funkcja która obsłuży ci każdy czas (minimalna jednostka to sekundy jak rozumiem a maksymalna to godziny)
  1. <?php
  2. function getUserTIme($time){
  3. $t=explode(':',$time);
  4. $przelicznik=1;
  5. $tmp=0;
  6. for ($i=count($t)-1;$i>=0;$i--){
  7. $tmp+=($przelicznik*((int)$t[$i]));
  8. $przelicznik*=60;
  9. }
  10. return $tmp;
  11. }
  12.  
  13.  
  14.  
  15. echo getUserTime('10:20:59');
  16. echo getUserTime('121:12');
  17. echo getUserTime('1330:230:259'); //dziwny to format ale tez zadziala ;]
  18.  
  19. //i funkcja przeliczjąca sekundy na inne jednostki
  20.  
  21. function timeFormat($sec){
  22. if ($sec>3600){
  23. $h=floor($sec/3600);
  24. $sec-=$h*3600;
  25. }
  26. if ($sec>60){
  27. $m=floor($sec/60);
  28. $sec-=$m*60;
  29. }
  30. return $h.':'.$m.':'.$sec;
  31. }
  32. ?>

jedno z głowy mamy czas w sekundach niezaleznie od tego czy user poda go w formacie prawidłowm czy też w przekłamanym następnie sprawdzenie prędkości usera w metrach na sekunde
  1. <?php
  2. function getUserSpeed($d,$time,$h=1000){ //pierwszy parametr to droga w metrach
  3. //a drugi to czas w sekundach (pobrany z poprzedniej funkcji
  4. //zwraca czas w sekundach potrzebny do przebycia zadanego w trzecim parametrze dys
    tansu (w metrach)
  5. return ($h*$time)/$d;
  6. }
  7.  
  8. echo getUserSpeed(42000,getUserTime('3:10:00')); //średni czas potrzebny na przebycie kilometra
  9. echo getUserSpeed(42000,getUserTime('3:10:00'),500); //średni czas na 500m
  10. ?>


no i teraz funkcja która z podanego wykona twoje odliczanie:
  1. <?php
  2. function getList($d,$t){ //pierwszy to dystans drugi czas 
  3. $sec=getUserTime($t);
  4. $dys=0;
  5. $speed=getUserSpeed($d,$sec,1000);
  6. $ts=0
  7. for ($i=$d;$i>=1000;$i-=1000){
  8. $ts+=$speed;
  9. $dys+=1000;
  10. echo $dys.' '.timeFormat($speed);
  11. }
  12. echo $d.' '.timeFormat($sec);
  13. }
  14. ?>

pisane z kija - nie wykluczone ze są literówki - przedstawiłem tu ogólną idee - zapewne da się to poprawić zeby bylo wydajniejsze ale ze względu na pore i spore zmeczenie - wiecej dzisiaj nie robie ;P
primo
Na pierwszy rzut oka - jestem w szoku. Gruntownie to przetestuję jak wrócę z pracy. Wielkie dzięki.

Udało mi się to już dostosować, jednak nie wiem czy coś błędnie robię, czy też nie jest to jeszcze obsługiwane przez ten kod.

Mianowicie http://www.treningbiegacza.pl/index.php?op=16 -- wypełniam formularz danymi: 42195 i 3:10:15 i ja chcę aby każdy następny kilometr który zostaje wyliczony był sumą poprzednich kilometrów, czyli:
1 -- 4:30
2 -- 9:00
3 -- 13:30 itd. -- potrzebna jest nowa funkcja, czy wystarczy dostosować funkcję getList() questionmark.gif
devnul
błąd logiczny w funkcji był (polyliłem nazwy zmiennych -zmęczenie happy.gif ), bo założenie było właśnie takie jak chciałeś - tu masz wersje porpawioną
  1. <?php
  2. function getList($d,$t){ //pierwszy to dystans drugi czas 
  3. $sec=getUserTime($t);
  4. $dys=0;
  5. $speed=getUserSpeed($d,$sec,1000);
  6. $ts=0
  7. for ($i=$d;$i>=1000;$i-=1000){
  8. $ts+=$speed;
  9. $dys+=1000;
  10. echo $dys.' '.timeFormat($ts);
  11. }
  12. echo $d.' '.timeFormat($sec);
  13. }
  14. ?>
primo
Jeszcze pokuszę się o drobne ulepszenie.

Mianowicie jak teraz klepniesz dane: 42195 i 3:10:15 to wychodzą wyniki:
1000 m :4:30.529683611802
2000 m :9:1.0593672236047
3000 m :13:31.589050835407


Chodzi mi o to że drugi kilometr jest mylący, bo powinno być 9:01, tak samo obcina inne kilometry mające po liczbie minut - sekundy do 10.
Kolejny problemik to jak ustawić, aby czas który jest poniżej godziny nie był wyświetlany z kropkami na początku, czyli: :4:30, aby było samo 4:30.
I wreszcie, czy przychodzi Ci na myśl inne potraktowanie wyniku, aby obcięło to co po kropce aniżeli moje rozwiązanie (jakby mało elastyczne):
  1. <?php
  2. $speed = substr($speed, 0, strlen($speed) - 12);
  3. ?>


Bo jak rozumiem to właśnie zmienną speed powinien potraktować jakąś funkcją obcinającą to co po przecinku questionmark.gif
devnul
  1. <?php
  2. function timeFormat($sec){
  3. $d=array();
  4. if ($sec>3600){
  5. $d[]=$h=floor($sec/3600);
  6. $sec-=$h*3600;
  7. }
  8. if ($sec>60){
  9. $d[]=$m=floor($sec/60);
  10. $sec-=$m*60;
  11. }
  12. $d[]=floor($sec);
  13. return join(':',$d);
  14. }
  15. ?>
rojmarek
Cytat(primo @ 4.04.2007, 16:11:29 ) *
Bo jak rozumiem to właśnie zmienną speed powinien potraktować jakąś funkcją obcinającą to co po przecinku questionmark.gif

intval() moze lepiej zamiast round.. ale to juz w zaleznosci co sie potrzebuej...
primo
Ciekawym jest, że przy danych 42195 i czasie 3:15:00 uzyskuję wynik:

13000 m 1::1
26000 m 2::2
39000 m 3::3
40000 m 3:4:40
41000 m 3:9:17
42000 m 3:13:54
42195 m 3:15:0
devnul
kurcze no już dostosowac sobie byś mógł a nie wszystko na gotowe - pisane z głowy - nie sprawdzane i nie testowane więc może działać nie do końca idealnie - aż tak trudno chyba drobne poprawki nanieść nie jest co?
primo
Cytat(devnul @ 4.04.2007, 19:20:36 ) *
kurcze no już dostosowac sobie byś mógł a nie wszystko na gotowe - pisane z głowy - nie sprawdzane i nie testowane więc może działać nie do końca idealnie - aż tak trudno chyba drobne poprawki nanieść nie jest co?



Nie no walczę. Ale każde moje rozwiązanie nie jest tak dobre jak Twoje. Poprawiłem wersję z dwukropkami, ale tak za"ifowałem" kod, że bardziej nie można było, jednak działał. Jednak jak zobaczyłem Twoje rozwiązanie to mnie oświeciło. Nie czekam, aż Ty zrobisz wszystko, mimo to wielkie dzięki za pomoc, tylko próbuję sam, bo tym sposobem coś się uczę. Jednak wykorzystując Twoje zaangażowanie w realizację piszę sprawozdanie z reazlizacji projektu, abyś miał wgląd w obecny stan funkcji.
Sorki, że tak wyszło.
devnul
prosze - juz sie balem ze czekasz na gotowca - chwała za walke
  1. <?php
  2. function timeFormat($sec){
  3. $d=array();
  4. if ($sec>3600){
  5. $d[]=$h=floor($sec/3600);
  6. $sec-=$h*3600;
  7. } else {
  8. $d[]=0
  9. }
  10. if ($sec>60){
  11. $d[]=$m=floor($sec/60);
  12. $sec-=$m*60;
  13. } else {
  14. $d[]=0;
  15. }
  16. $d[]=floor($sec);
  17. return join(':',$d);
  18. }
  19. ?>
to powinno rozwiązać dziwne wyświetlanie czasu
primo
Odrobinę ulepszona, wydaje mi się finalna wersja funkcji Timeformat:
  1. <?php
  2. public function timeFormat($sec){ 
  3.  $d=array(); 
  4.  if ($sec>3600){ 
  5. $h=floor($sec/3600); 
  6. if($h<10) $d[]='0'.$h; else $d[]=$h; 
  7. $sec-=$h*3600; 
  8.  } else { 
  9. $d[]='00'; 
  10.  } 
  11.  if ($sec>60){ 
  12. $m=floor($sec/60); 
  13. if($m<10) $d[]='0'.$m; else $d[]=$m; 
  14. $sec-=$m*60; 
  15.  } else { 
  16. $d[]='00'; 
  17.  }  
  18.  $s=floor($sec); 
  19.  if($s<10) $d[]='0'.$s; else $d[]=$s;
  20.  return join(':',$d); 
  21.  }
  22. ?>


Mam pytanko jednak jeszcze, czy php potrafi być dokładny questionmark.gif Przykładowo, gdy biegnę na 10000m i uzyskam czas 40:08 to powinno wyliczyć każdy km po 4:01, jednak wylicza mi każdy po 4:00 a dopiero ostatni km wylicza w czasie 4:08 -- może się czepiam, ale tak się tylko pytam czy jest możliwość zwiększenia dokładności.
devnul
myśle że wystarczy dodać zaokrąglenie (bo w podanym przykłądzie to jest jednak troche mniej niż 4:01
  1. <?php
  2. function timeFormat($sec){
  3. $sec=round($sec);
  4. //...
  5. }
  6. ?>
primo
Wykorzystałem również to, że zaiplementowałeś możliwość określania długości odcinka wg którego ma być mierzony międzyczas. W sumie to jedno z najprzydatniejszych możliwości tego narzędzie. Precyzja 200m zwiększa możliwości użytkowe, bo można wtedy wykorzystać to do biegania na stadionie gdzie pętla ma 400 m.

Mam pytanko odnośnie przesłania wyników do jakieś klasy drukującej. Istnieje jakieś gotowe rozwiązanie z którego mógłbym skorzystać questionmark.gif Trudno, idąc na trening zapamiętać międzyczasy z 20km co 200m smile.gif
devnul
wystarczy ze odpowiednio skonstruujesz format wyjściowy (kod html) a później tylko w przeglądarce to wydrukować wystarczy (możesz wyjście tworzyć jako tabele czy jak tam chcesz - proponuje przerobić funkcje getList() tak aby zwracała tablice z wynikami a później na niej operów w celu uzyskania odpowiedniego rezultatu (czyli np tabeli z wynikami)
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.