DateTime :: Diff powinien obliczać prawidłowy interwał i uwzględniać czas letni (DST) i lata przestępne. Chociaż podobno tak nie jest. Kod horroru:PHP's DateTime :: Diff robi się źle?
$d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm"));
$d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm"));
echo $d1->getOffset()/(60 * 60);
Drukuje "2"! Należy pamiętać, że czas UTC = 1h - 2h = 23:05:00 dzień wcześniej.
echo $d2->getOffset()/(60 * 60);
Drukuje "1". DST się stało. Czas UTC = 3h - 1h = 02:05:00.
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Drukuje "2"! Źle?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp())/60/60;
echo "Calculated difference in hours: $hoursofdiff";
Drukuje "3"! Poprawny?
Gdy zegar obrócił się o 03:00:00 w danym dniu, wszyscy Szwedzi odwrócili swój zegar o godzinę do godziny 02:00:00. Oznacza to, że całkowita kwota przekazana między 01:05 a 03:05 wynosi trzy godziny, podobnie jak w przypadku ręcznego obliczenia, które pojawiło się podczas korzystania z programu UNIX TimeStamp. I podobnie jak obliczamy na naszych palcach, jeśli używamy analogowego zegara. Tym bardziej, że obliczając różnicę między dwoma znacznikami czasu UTC, korzystałem z własnej logiki PHP (!).
Czy to PHP czy mój mózg przestał działać poprawnie? Nagana z każdego z was, wszystkich bogów, którzy istnieją na tej stronie, sprawiłaby mi wielką radość!
Używam PHP 5.4 (VC9) na serwerze Apache. Niestety używam Windows 7 x64 jako OS. Przetestowałem swoją instalację przed wszelkimi roszczeniami błędów w klasach Date/Time PHP (jest kilka powiązanych z Windowsiem) i mogę potwierdzić, że mój system nie ma żadnego z nich. Poza powyższym kodem nie znalazłem żadnych innych błędów. Prawie zweryfikowałem cały kod i wyprowadziłem książkę "Przewodnik architekta PHP do programowania daty i czasu". Dlatego muszę stwierdzić, że to musi być mój mózg, który wiedźmo wyleczył, ale myślałem, że najpierw go tu zrobię.
samo na 5.3.6 na OS X i 5.3.9 na Ubuntu – Phil
także efekty 'DateTime :: sub()' i 'DateTime :: add() ' – Phil