Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [php]Odejmowanie dwóch godzin
code46
post 8.04.2008, 20:26:06
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 21.04.2005

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


Nie wiem jak poradzić sobie z problemem odejmowania dwóch godzin. Poniżej przykłady i wyniki jakie chciałbym uzyskać.

19.30 - 6.00 -> 13,5
16.45 - 8.00 -> 8,45
16.32 - 7.10 - > 9,22
Go to the top of the page
+Quote Post
batman
post 8.04.2008, 20:55:42
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Pisane z palca, ale powinno działać.
  1. <?php
  2. $h1 = 16;
  3. $h2 = 7;
  4. $m1 = 32;
  5. $m2 = 10;
  6.  
  7. echo date("H:i", mktime(($h1 - $h2), ($m1 - $m2)));
  8. ?>


edit
Przed chwilą poniżej była wypowiedź podważająca działanie tego kodu winksmiley.jpg


Tak, to zadziała, ponieważ, jeśli $h1 < $h2, to obliczy godzinę dla dnia poprzedniego:
  1. <?php
  2. echo date("d H:i", mktime(($h1 - $h2), ($m1 - $m2)));
  3. ?>


Ten post edytował batman 8.04.2008, 20:56:53


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 14:23:58
Post #3





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Potrzebuję sposobu podobnego do tego zaprezentowanego wyżej ale bez konieczności rozbijania godzin na minuty.
Tzn, że z bazy pobieram dwie godziny np:

$a = '16:32';
$b = '07:10';

Chcę uniknąć używania explode() w wiadomych przyczyn. Macie jakiś pomysł? Bo do tej pory robiłem to tak:
  1. <?php
  2. $fResult = date("H.i", strtotime($aWTR['koniec_pracy'])) - date("H.i", strtotime($aWTR['poczatek_pracy']));
  3. ?>


Ale przy godzinach

07:45
16:15

wynik 8,7 a powinno być 8,5 godziny. Musiałbym wyciągnąć wartości setne i tą wartość odjąć od 100. Za dużo danych i to zbyt duże obciążenie.

Ten post edytował Jarod 30.04.2008, 20:24:35


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
Kicok
post 30.04.2008, 16:30:08
Post #4





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Wywal obie funkcje date (zostaw tylko strtotime) i podziel sobie wynik przez 3600.


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 17:07:05
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(Kicok @ 30.04.2008, 15:30:08 ) *
Wywal obie funkcje date (zostaw tylko strtotime) i podziel sobie wynik przez 3600.


Działa dla godzin:
07:45
16:15

natomiast dla godzin:
$a = '16:32';
$b = '07:10';

podaje wynik 9.36 co jest głupotą.. Powinno być 9,22. Potrzebuje sposobu, który zawsze dobrze obliczy..


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
lilik
post 30.04.2008, 17:50:02
Post #6





Grupa: Zarejestrowani
Postów: 66
Pomógł: 5
Dołączył: 17.03.2005

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


naprosciej wedlug mnie

  1. <?php
  2. $c1 = strtotime("16:32");
  3. $c2 = strtotime("07:10");
  4. $czas1 = $c1-2*3600;
  5. $czas2 = $c2-2*3600;
  6. echo date("H:i", $czas1); 
  7. echo date("H:i", $czas2);
  8. ?>
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 18:01:08
Post #7





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(lilik @ 30.04.2008, 16:50:02 ) *
naprosciej wedlug mnie

  1. <?php
  2. $c1 = strtotime("16:32");
  3. $c2 = strtotime("07:10");
  4. $czas1 = $c1-2*3600;
  5. $czas2 = $c2-2*3600;
  6. echo date("H:i", $czas1); 
  7. echo date("H:i", $czas2);
  8. ?>



Sprawdzę. Wytłumacz dlaczego
Kod
-2   *3600


EDIT:.
Co chciałeś osiągnąć tym kodem? Spróbuj odjąć od godziny 16:32 godzinę 7:10... Ma ktoś jakiś inny pomysł?

Ten post edytował Jarod 30.04.2008, 18:22:23


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
lilik
post 30.04.2008, 18:48:52
Post #8





Grupa: Zarejestrowani
Postów: 66
Pomógł: 5
Dołączył: 17.03.2005

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


prosze bardzo

  1. <?php
  2. $c1 = strtotime("16:32");
  3. $c2 = strtotime("07:10");
  4. $czas1 = $c1-$c2;
  5.  
  6. echo date("H:i", $czas1);
  7. ?>


wynik 10:22
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 18:54:33
Post #9





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(lilik @ 30.04.2008, 17:48:52 ) *
wynik 10:22


Wiem jaki daje wynik bo sprawdzałem. Uważasz, że jest prawidłowy?:/


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
erix
post 30.04.2008, 19:12:24
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




http://lwest.free.fr/doc/php/lib/date-en.html#sec_29


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Kicok
post 30.04.2008, 19:16:39
Post #11





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
Działa dla godzin:
07:45
16:15

natomiast dla godzin:
$a = '16:32';
$b = '07:10';

podaje wynik 9.36 co jest głupotą.. Powinno być 9,22.


Wzorowałem się na twoim drugim poście, w którym napisałeś:
Cytat
Ale przy godzinach

07:45
16:15

wynik - 8,7 a powinno być 8,5 godziny.

Więc jeśli różnica wynosi "dziewięć i pół godziny" to skrypt wyświetli 9,5. Jeśli natomiast różnica wynosi "dziewięć i dwadzieścia dwa sześćdziesiąte godziny", to wyświetli: 9,36

Jeśli zamiast 9,5 chcesz mieć 9:30, to:
Kod
$godziny = floor( $roznica_w_sekundach / 3600 );
$minuty = ( $roznica_w_sekundach % 3600 ) / 60


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 19:25:10
Post #12





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(Kicok @ 30.04.2008, 18:16:39 ) *
Jeśli zamiast 9,5 chcesz mieć 9:30, to:
Kod
$godziny = floor( $roznica_w_sekundach / 3600 );
$minuty = ( $roznica_w_sekundach % 3600 ) / 60


@Kicok: rozumiem, tylko, musiałbym rozbić godziny i minuty za pomocą explode() co nie jest mi na rękę ze względów wydajnościowych.
Generalnie sprowadziłeś rozwiązanie do rozwiązania batmana.


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
erix
post 30.04.2008, 19:35:55
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




  1. <?php
  2. $c1 = strtotime("16:32");
  3. $c2 = strtotime("07:10");
  4. if($c1>$c2){
  5. echo date('H:i', $c1-$c2);
  6. }else{
  7. echo date('H:i', $c2-$c1);
  8. }
  9. ?>

?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 19:49:25
Post #14





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


@erix: przecież ten kod zwraca błędy wynik.. 10:22? Powinno być 9:22 winksmiley.jpg


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
erix
post 30.04.2008, 20:05:42
Post #15





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Dorzuć
  1. <?php
  2. date_default_timezone_set('UTC');
  3. ?>

na początku. ;]


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Jarod
post 30.04.2008, 20:09:29
Post #16





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Mam
  1. <?php
  2. date_default_timezone_set('Europe/Warsaw');
  3. ?>
Dlaczego UTC?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
erix
post 30.04.2008, 20:21:16
Post #17





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Szczerze mówiąc, sam nie mogę trochę zrozumieć, dlaczego... sciana.gif

Ale przy strefie UTC przelicza prawidłowo, przy innych już dodaje tą nadmiarową godzinę. Niby przesunięcie czasowe powinno być takie same w obu przypadkach...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
lilik
post 30.04.2008, 20:55:42
Post #18





Grupa: Zarejestrowani
Postów: 66
Pomógł: 5
Dołączył: 17.03.2005

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


oj to wystarczy odjac ta dodatkowa godzine

  1. <?php
  2. $c1 = strtotime("16:32");
  3. $c2 = strtotime("07:10");
  4. $czas1 = ($c1-$c2) -3600;
  5. echo date("H:i", $czas1);
  6. ?>
Go to the top of the page
+Quote Post
erix
post 30.04.2008, 21:18:27
Post #19





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ok, zmienią się ustawienia czasu (zimowy/letni) i będzie trzeba kombinować. A podejrzewam, że i to może mieć wpływ...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Kicok
post 1.05.2008, 08:51:39
Post #20





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
@Kicok: rozumiem, tylko, musiałbym rozbić godziny i minuty za pomocą explode() co nie jest mi na rękę ze względów wydajnościowych.
Generalnie sprowadziłeś rozwiązanie do rozwiązania batmana.


Kiedy ja o jakimś explode wspominałem? strtotime" title="Zobacz w manualu PHP" target="_manual
  1. <?php
  2.  
  3. $a = '16:32';
  4. $b = '07:10';
  5.  
  6. $roznica_w_sekundach = strtotime( $a ) - strtotime( $b );
  7.  
  8.  
  9. $godziny = floor( $roznica_w_sekundach / 3600 );
  10. $minuty = ( $roznica_w_sekundach % 3600 ) / 60;
  11.  
  12. echo "$godziny:$minuty";
  13.  
  14. ?>



A po drugie to skąd to przekonanie, że explode jest mało wydajne? Według tego testu jest o wiele wydajniejsze niż używanie strtotime" title="Zobacz w manualu PHP" target="_manual:
  1. <?php
  2.  
  3. date_default_timezone_set( 'Europe/Warsaw' );
  4.  
  5. $a = '16:32';
  6. $b = '07:10';
  7.  
  8.  
  9. // Sposób 1
  10.  
  11. $start1 = microtime( true );
  12. for( $i = 0; $i < 100000; $i++ )
  13. {
  14. $roznica_w_sekundach = strtotime( $a ) - strtotime( $b );
  15.  
  16. $godziny = floor( $roznica_w_sekundach / 3600 );
  17. $minuty = ( $roznica_w_sekundach % 3600 ) / 60;
  18. }
  19. $stop1 = microtime( true );
  20. //
  21. echo "Sposób 1: $godziny:$minuty - " . ( $stop1 - $start1 ) . '<br />';
  22.  
  23. // Sposób 2
  24. $start2 = microtime( true );
  25. for( $i=0; $i < 100000; $i++ )
  26. {
  27. $czasa = explode( ':', $a );
  28. $czasb = explode( ':', $b );
  29.  
  30. $roznica_w_minutach = ( $czasa[0] * 60 + $czasa[1] ) - ( $czasb[0] * 60 + $czasb[1] );
  31.  
  32. $godziny = floor( $roznica_w_minutach / 60 );
  33. $minuty = $roznica_w_minutach % 60;
  34. }
  35. $stop2 = microtime( true );
  36. //
  37. echo "Sposób 2: $godziny:$minuty - " . ( $stop2 - $start2 ) . '<br />';
  38.  
  39. ?>


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 28.04.2024 - 13:53