Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Operacje matematyczne na czasie trwania (nie chodzi o obliczanie daty)
icamtuff
post 14.06.2017, 10:45:43
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.06.2017

Ostrzeżenie: (0%)
-----


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

Ten post edytował icamtuff 14.06.2017, 11:24:53
Go to the top of the page
+Quote Post
trueblue
post 14.06.2017, 10:50:22
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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)?


--------------------
Go to the top of the page
+Quote Post
icamtuff
post 14.06.2017, 11:16:41
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.06.2017

Ostrzeżenie: (0%)
-----


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ź)
Go to the top of the page
+Quote Post
Pyton_000
post 14.06.2017, 11:23:49
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
icamtuff
post 14.06.2017, 11:26:35
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.06.2017

Ostrzeżenie: (0%)
-----


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... :/

Ten post edytował icamtuff 14.06.2017, 11:32:00
Go to the top of the page
+Quote Post
trueblue
post 14.06.2017, 11:31:06
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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));


--------------------
Go to the top of the page
+Quote Post
icamtuff
post 14.06.2017, 11:34:12
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.06.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 14.06.2017, 11:36:39
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Tak tylko tym sposobem nie zrobisz więcej niż 24h
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 06:11