Autor Zpráva
Samm
Profil *
Dobrý den, při přechodu na letní čas se mi začali v aplikaci která hodně využivá data objevovat chyby.
V aplikaci používám hojně strtotime a date. Date se mi zdá být v pořádku, ale strtotime zlobi.
Nevíte prosim, jak nastavim v php národní prostředí nebo něco co by přinutilo strtotime aby to počítalo počítalo správně o jednu hodinu méně ?
Ivo Puffer
Profil *
Jak konkrétně to zlobilo? Mně se to stalo také, hlavně když jsem přidával dny. Když jsem dal k datu 29.3.2008 4:00
"+1 day", vyšlo sice 30.3.2008 4:00, ale rozdíl mezi nimi je 82800 sekund, tj. 23. hodin.
Takže v tomto případě převést datum na juliánské, přidat k tomu něco a to převést zpět na běžné datum.

Kód:
function fix($x)
{
if ($x<0) return -1*floor(-1*$x);
return floor($x);
}

Function jday($year, $month, $day, $hour, $min, $sec, $greg=1)
{
$a = 10000.0 * $year + 100.0 * $month + $day;
If ($a < -47120101)
{
echo "Warning: date too early for algorithm";
}
If ($month <= 2)
{
$month += 12;
$year--;
}
If ($greg == 0) {
$b = -2 + fix(($year + 4716) / 4) - 1179;
} else {
$b = Fix($year / 400) - Fix($year / 100) + Fix($year / 4);
}
$a = 365.0 * $year + 1720996.5;
$jday = $a + $b + fix(30.6001 * ($month + 1));
$jday = $jday + $day + ($hour + $min / 60 + $sec / 3600) / 24;

return $jday;
}

function JulianToCalendar($julian)
{
$X = (Float)($julian)+0.5;
$Z = floor($X);
$F = $X - $Z;
$Y = floor(($Z-1867216.25)/36524.25);
$A = $Z+1+$Y-floor($Y/4);
$B = $A+1524;
$C = floor(($B-122.1)/365.25);
$D = floor(365.25*$C);
$G = floor(($B-$D)/30.6001);
$month = ($G<13.5) ? ($G-1) : ($G-13);
$year = ($month<2.5) ? ($C-4715) : ($C-4716);
$UT = $B-$D-floor(30.6001*$G)+$F;
$day = floor($UT);
$UT -= floor($UT);
$UT *= 24;
$hour = floor($UT);
$UT -= floor($UT);
$UT *= 60;
$minute = floor($UT);
$UT -= floor($UT);
$UT *= 60;
$second = round($UT);
$ret=array(
"year"=>$year,
"month"=>$month,
"day"=>$day,
"hour"=>$hour,
"minute"=>$minute,
"second"=>$second
);
unset($X);
unset($Z);
unset($F);
unset($Y);
unset($A);
unset($B);
unset($C);
unset($D);
unset($G);
unset($UT);
return $ret;
}

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:

0