DateTime :: Diff dovrebbe calcolare un intervallo appropriato e tenere conto del periodo di ora legale (DST) e degli anni bisestili. Anche se a quanto pare non è così. Codice horror:DateTime :: Diff di PHP sbaglia?
$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);
Stampe "2"! Tieni presente quindi che il tempo UTC = 1h - 2h = 23:05:00 del giorno prima.
echo $d2->getOffset()/(60 * 60);
Stampe "1". DST è successo. Ora UTC = 3h - 1h = 02:05:00.
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Stampe "2"! Sbagliato?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp())/60/60;
echo "Calculated difference in hours: $hoursofdiff";
Stampe "3"! Corretta?
Quando l'orologio girato 03:00:00 alla data indicata, tutti gli svedesi girato il loro orologio indietro di un'ora alle 02:00:00. Ciò significa che l'importo totale passato tra le 01:05 e le 03:05 è di tre ore, proprio come il calcolo manuale emesso quando si utilizza UNIX TimeStamp. E molto simile a quello che calcoliamo sulle nostre dita se usiamo un orologio analogico. A maggior ragione quando calcoliamo la differenza tra i due timestamp UTC, ho usato la logica di offset di PHP (!).
Va PHP o avere il mio cervello ha smesso di funzionare correttamente? Un rimprovero da parte di chiunque di voi tutti gli dei che esistono su questo sito mi renderebbe così felice!
Sto utilizzando PHP 5.4 (VC9) su un Apache server. Purtroppo io uso Windows 7 x64 come sistema operativo. Ho testato il mio setup contro tutte le richieste di bug nelle classi Date/Time di PHP (ce ne sono un paio relative a Windows) e posso confermare che il mio sistema non ne ha. Ad eccezione del codice sopra indicato, non ho trovato altri errori. Ho praticamente convalidato tutto il codice e prodotto il libro "PHP Architect's Guide to Date and Time Programming" che avevo da offrire. Quindi devo concludere che deve essere il mio cervello che la strega è inadempiente, ma ho pensato di dargli un primo scatto qui.
Stesso sulla 5.3.6 su OS X e 5.3.9 su Ubuntu – Phil
anche effetti 'DateTime :: sub()' e 'DateTime :: add() ' – Phil