Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Operacje matematyczne na czasie trwania (nie chodzi o obliczanie daty)
Forum PHP.pl > Forum > Przedszkole
icamtuff
Będąc marnej jakości początkującym programistą natknąłem na problem obliczania czasu i operacji matematycznych na nim. Mam na myśli podanie czasu trwania (wstępnie do 24h max) i skrócenie tego czasu o pół, o 10%, o 25% itd. itp.

Wymodziłem sobie taki prosty formularz gdzie użytkownik podaje trzy elementy czasu czyli godziny, minuty i sekundy:

  1. Hours: <input type="text" name="eta_h" value="0" /><br />
  2. Minutes: <input type="text" name="eta_m" value="0"/><br />
  3. Seconds: <input type="text" name="eta_s" value="0" /><br /><hr />


Następnie wybiera wartość procentową o ile ma być ten czas skrócony:
  1. <input type="radio" name="bType" value="0.25"checked> 25%<br>
  2. <input type="radio" name="bType" value="0.5"> 50%<br>


Zbieram dane (na razie GETem) i wymodziłem coś takiego korzystając z jednego z przykładów znalezionego gdzieś w czeluściach Internetu:
  1. $strStart = '2001-01-01 00:00';
  2. $strEnd = '2001-01-01 '.$_GET['eta_h'].":".$_GET['eta_m'].":".$_GET['eta_s'];
  3.  
  4. $dteStart = new DateTime($strStart);
  5. $dteEnd = new DateTime($strEnd);
  6. $dteDiff = $dteStart->diff($dteEnd);


Teraz mam problem dalej bo np. gdy chciałbym skrócić ten czas o 10% lub 1/3 to wszystko działa bardzo fajnie jeśli podam czas/datę jakąś dużą czyli 16 godzin bo jeśli chcę przyciąć czas dwudziestu minut o np 25% to widzę, że jest to traktowane jako godzina 0:20 (dwadzieścia po północy), a nie po prostu dwadzieścia minut:

  1. $boostType = $_GET['bType'];
  2.  
  3. $timePOSIX = strtotime($format);
  4.  
  5. $a = $timePOSIX;
  6. $b = $boostType;
  7. echo "<br/>";
  8. echo date("H:i:s",$a-$a*$b);


Wypluwa mi:
  1. 00:20:00
  2.  
  3. 06:15:00


zamiast 15 minut.

Czy ktoś może mi wyłożyć i wbić do łba co robię źle w moim procesie myślowym, jak ten problem ugryźć i przede wszystkim rozwiązać? Bo coś mi się wydaje, że źle biorę się za rozwiązanie problemu. Prosiłbym też o łopatologiczne wyjaśnienie i pomoc.

Z góry dziękuję za pomoc smile.gif
trueblue
Co to znaczy, że skracasz czas? Skracasz sekundy, minuty czy godziny odrębnie, czy może skracając minuty oczekujesz skrócenia również godzin (traktujesz godzinę jako 60 minut)?
icamtuff
Cytat(trueblue @ 14.06.2017, 10:50:22 ) *
Co to znaczy, że skracasz czas? Skracasz sekundy, minuty czy godziny odrębnie, czy może skracając minuty oczekujesz skrócenia również godzin (traktujesz godzinę jako 60 minut)?

To znaczy, że jak mam 2h 43m 33s i skracam o 25% to chcę uzyskać:
  1. 2h = 7200
  2. 43m = 2580
  3. 33ss = 33
  4. -----------
  5. 9813
  6. -25% = 7395,75 (~7396) = 2h 0m 3s
  7.  


(dziękuję za odpowiedź)
Pyton_000
No i odpowiedziałeś sobie sam na swój problem.

Musisz mieć 2 funkcjie:
- konwertującą do sekund (https://stackoverflow.com/questions/4834202/convert-time-in-hhmmss-format-to-seconds-only)
- konwertującą do godzin (https://stackoverflow.com/a/20870843/3732803)

Zamieniasz na sekundy, wyliczasz, konwertujesz, wyświetlasz.
icamtuff
Cytat(Pyton_000 @ 14.06.2017, 11:23:49 ) *
No i odpowiedziałeś sobie sam na swój problem.

Musisz mieć 2 funkcjie:
- konwertującą do sekund (https://stackoverflow.com/questions/4834202/convert-time-in-hhmmss-format-to-seconds-only)
- konwertującą do godzin (https://stackoverflow.com/a/20870843/3732803)

Zamieniasz na sekundy, wyliczasz, konwertujesz, wyświetlasz.

Ok, spróbuję ale czy to czasem znowu mi nie wypluje jakiejś godziny szóstej rano gdy podam 20 minut?


EDIT: chyba wiem w czym problem miałem - trzeba przyjąć jako "bazę" początkowy start POSIXowy czyli pierwszy stycznia '70 s strefie UTC. Dlatego strtotime() wyrzucał mi jakieś dziwne wyniki bo to było interpretowane jako rok 2017, a 25% z 47 lat (od 70 do 17) to 12 lat... :/
trueblue
  1. date_default_timezone_set('Europe/Warsaw');
  2. $boostType = 0.25;
  3. $timePOSIX = strtotime('02:43:33');
  4. $midnight = strtotime('00:00:00');
  5. $a = $timePOSIX-$mid; //odejmujemy północ, a właściwie część daty, aby nie wyliczać procentu z całości sekund od 1970
  6. $b = $boostType;
  7. echo date("H:i:s",$mid+$a-($a*$b));
icamtuff
Cytat(trueblue @ 14.06.2017, 11:31:06 ) *
  1. date_default_timezone_set('Europe/Warsaw');
  2. $boostType = 0.25;
  3. $timePOSIX = strtotime('02:43:33');
  4. $midnight = strtotime('00:00:00');
  5. $a = $timePOSIX-$mid; //odejmujemy północ, a właściwie część daty, aby nie wyliczać procentu z całości sekund od 1970
  6. $b = $boostType;
  7. echo date("H:i:s",$mid+$a-($a*$b));



Teraz zobaczyłem jaką głupotę robiłem - pominąłem argument północy i dlatego mi wyrzucał daty wsteczne.

Dziękuję za pomoc Wam obu! smile.gif
Pyton_000
Tak tylko tym sposobem nie zrobisz więcej niż 24h
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.