[php] Odejmowanie Czasu


(WooQash) #1

Witam, od 2-ch dni męczę się ze znalezieniem funkcji która pozwoli mi na odejmowanie czasu. Problemem by nie było odjęcie samych godzin i minut, ale ja mam minuty, sekundy i tysięczne sekundy (ew. sekundy i tysięczne sekundy z późniejszą zamianą 60 sek na 1 minute itd.). Każdy skrypt który użyłem działał w jakimś stopniu. Jeden ze skryptów działał na zasadzie samych sekund i tysięcznych ale nie mogłem zamienić potem 60 sekund na minutę. Drugi skrypt zamieniał ładnie wszystko począwszy od minut sekund i tysięcznych ale nie mogłem ustalić 3-ch miejsc po przecinku. Poniżej daję oby dwa skrypty, chyba przerobione kilkanaście razy każdy i nic. Daję je takie jakie działają.

<?php";$wynik = array ( array("15", "Osoba 1", "Team 1", "1:","32.381"), array("14", "Osoba 2", "Team 2", "1:","33.480"), array( "7", "Osoba 3", "Team 3", "1:","34.548"),

(kostek135) #2

Możesz np.

while($sekundy>=60)

{

   $sekundy=$sekundy-60;

   $minuta++;

}

(WooQash) #3

Hmm,

Fatal error: Maximum execution time of 30 seconds exceeded in D:\Program Files\VertrigoServ\www\cos.php on line 16

czyli

<?php
echo ";
$wynik = array (
 array("15", "Osoba 1", "Team 1", "92.381"),
 array("14", "Osoba 2", "Team 2", "93.480"),
 array( "7", "Osoba 3", "Team 3", "94.548"),
);
for ($i=0;$i<count($wynik);$i++) {
 $lp = $i + 1;
 $strata[$i] = round($wynik[$i][3] - $wynik[0][3], 3);
 $strata[$i] = str_replace("-".$wynik[0][4],0,$strata[$i]);
 $j = $i - 1;
 $j = str_replace(-1,0,$j);
 $odstep[$i] = round($wynik[$i][3] - $wynik[$j][3], 3);
 
 while($wynik[$i][3]>=60)
{
   $sekund=$sekund-60;
   $minuta++;
}
echo "\n";
 echo "".$lp."\n";
 echo "".$wynik[$i][0]."\n";
 echo "".$wynik[$i][1]."\n";    
 echo "".$wynik[$i][2]."\n";    
 echo "".$minuta.$sekund."\n";
 echo "";
 printf("%.03f", $strata[$i]);
 echo "\n";
 echo "";
 printf("%.03f", $odstep[$i]);
 echo "\n";
echo "\n";
}
echo ";
?>[/code]

(kostek135) #4

Hmm przecież w ten sposób while będzie wykonywał się bez końca

while($wynik[$i][3]>=60)

{

   $wynik[$i][3]=$wynik[$i][3]-60;

   $minuta++; /*a to zamień na swoją zmienną, która przechowuje minuty (nie mam pojęcia która to jest u ciebie)*/

}

(Krzkaczor) #5

Za przeproszeniem no czy was &*&*&$@##?

Mamy załóżmy $time = 123 sekundy, Hmmm jak to zamienić na format MM:SS otóż:

dzielimy 123/60 (tyle sekund ma jedna minuta), zaokrąglamy w dół i przypisujemy do zmiennej min (wychodzi nam 2). Następnie bierzemy i robimy takie cudo:$sek = $time - min*60 => $sek = 123 - 60*2 => $sek = 3. O dziwo działa. O wiele wydajniejsze…


(WooQash) #6

A może nie co jaśniej, jeśli można?


(Krzkaczor) #7
$time = 123; //<- tutaj masz zmienna zawerajaca czas w sekundach

$minuty = floor($time/60);

$sek = $time - $minuty * 60;

Krótsze, szybsze i bardziej eleganckie.


(WooQash) #8

Prawie git, ale brakuje mi zer w sekundach jak jest np. 123 to jest 2:3.000 zamiast 2:03.000 :smiley:


(Krzkaczor) #9

Tutaj też z pomocą służy cpt. obvious

if ($sek < 10) $sek = '0'.$sek;

(WooQash) #10

Ok, ale teraz jedno wyklucza drugie i jestem w punkcie wyjścia. Bo albo jest 2:05.15 albo 2:5.150

<?php= 125.150; //- tutaj masz zmienna zawerajaca czas w sekundach$minuty = floor($time/60);$sek = $time - $minuty * 60;$sek  10) $sek = '0'.$sek;$minuty.":".$sek;?[/code]


[code=php]?php= 125.150; //- tutaj masz zmienna zawerajaca czas w sekundach$minuty = floor($time/60);$sek = $time - $minuty * 60;$minuty.":";printf("%.03f", $sek);?

(Damgora) #11
$sek = $time % 60;

czepiam się, ale tak chyba prościej


(WooQash) #12

Wersja SyntaxError’a lepsza, bo wtedy działają znaki po kropce (tysięczne sekundy). Ale nadal nie wiem jak zrobić by było zero w pierwszych 9 sekundach i przy tym 3 miejsca po kropce. Bo albo, albo.


(Damgora) #13

no to przepraszam (może funkcja fmod() dałaby właściwy rezultat, ale wątpię by była wydajniejsza)

Wracając do właściwego problemu:

echo $minuty.':'.(($sek<10)?'0':'').number_format($sek, 3);

piszę z komórki, bez dostępu do kompilatora, więc zdziwię się jeśli nie ma błędów. W każdym razie chodzi o coś na tej zasadzie.


(WooQash) #14

cayman3_11 , to się zdziw bo zadziałało :slight_smile: Póki co dzięki, jeśli w dalszej pracy z tym będę miał problemy to się jeszcze Was poradzę, póki co działa.