Autor Zpráva
Budry
Profil
Zdravím,
narazil jsem na jeden "problém" s funkcí date a vypočítávání rozdílu mezi dny.

Zjišťuji počet dní mezi dvěma daty ale při některých datech dochází k divným výsledkům.

Ukázka:
$a = date("U", mktime(0,0,0,10,29,2010));
$b = date("U", mktime(0,0,0,9,26,2010));

echo (($a - $b) / 3600 ) / 24; // vypíše 33

Výsledek je celé číslo (33) což by logicky být mělo.

ale ten samý postup s jiným rokem vrací číslo desetinné (33.0416...):
$a = date("U", mktime(0,0,0,10,29,2012));
$b = date("U", mktime(0,0,0,9,26,2012));

echo (($a - $b) / 3600 ) / 24;  // vypíše 33.0416....

Zkoušel jsem i jiné roky jestli není problém s přestupným rokem, jak to zprvu vypadalo ale stejný problém je i s roky 2007, 2008, 2009 kdy oba vracejí desetinné číslo (33.0416...)
Zato rok 2006 vrací celé číslo 33.

Mohl by mi někdo vysvětlit proč to tak je?
Pozn. Číslo za desetinou tečkou ke vždy stejné .0416...
Kajman
Profil
Je to posunem času z letního zpátky na středoevropský, což se u nás děje zpravidla ze soboty na neděli a přesné datum může být v různých rocích různé.
Budry
Profil
Aha, díky furt sem přemýšlel čím by to mohlo být, ale todle mě nenapadlo
Enko
Profil *
Na výpočet rozdílu v časech zkus použít třeba toto:
//funkce na zjisteni zbyvajiciho casu
function get_time_difference($start, $end){
  $uts['start'] = strtotime($start);
  $uts['end'] = strtotime($end);
  if($uts['start'] !== -1 && $uts['end'] !== -1){
    if($uts['end'] >= $uts['start']){
      $diff = $uts['end'] - $uts['start'];
      if($days = intval((floor($diff / 86400))))
        $diff = $diff % 86400;
      if($hours = intval((floor($diff / 3600))))
        $diff = $diff % 3600;
      if($minutes = intval((floor($diff / 60))))
        $diff = $diff % 60;
        $diff = intval($diff);            
    return(array('days'=>$days, 'hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$diff));
    }
    else{
    //trigger_error("Konečný datum a čas je starší než počáteční!", E_USER_WARNING);
    }
  }
  else{
    //trigger_error("Zjištěno neplatné datum nebo čas!", E_USER_WARNING);
  }
  return(false);
}

A pak to použiješ třeba takto:
  $arr = get_time_difference("now", "$rok-$mesic-$den $hodina:$minuta:$sekunda");
Kajman
Profil
Enko:
Ale těch 20 řádků kódu navíc přeci neřeší nic na tom, že pro uvedené datumy to v českém prostředí vyjde v některých letech 33 dní a někdy 33 dní a jedna hodina.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: