mktime() – Attenzione all’ora legale

Vi siete mai posti il problema di come calcolare la differenza fra due date in php? Lavorando in un tour operator che deve calcolare i giorni di in e out dei propri clienti dagli alberghi, la cosa è necessaria : - ) .

Per farlo ho usato il meraviglioso mktime(). Funzione del php che restituisce un UNIX Timespamp, utilizzabile per calcolare differenze secche fra date. La funzione è così strutturata:

mktime(hour, minute, second, month, day, year)

Per calcolare una differenza fra date avento giorno, mese ed anno basterà fare qualcosa del genere:

$inizio = mktime(0, 0, 0, $meseinizio, $giornoinizio, $annoinizio);
$fine = mktime(0, 0, 0, $mesefine, $giornofine, $annofine);
$giorni = $fine – $inizio;
$giorni = intval($giorni / 86400); /*ovvero (24*60*60)*/

La cosa funziona bene, se non che bisogna stare attenti ad una cosa: l’ora legale! In certi casi infatti un’ora di differenza nel timestamp con relativo uso di intval per ottenere il valore intero, può causare gravi problemi.
Ed è proprio quello che è successo oggi in ufficio, dove la differenza di data fra 25/03/2007 e 27/03/2007 restituiva un solo giorno.

Per risolvere è possibile far ignorare l’ora legale a mktime aggiungendo un nuovo argomento alla funzione:

// Con ,0 alla fine ignoro l’ora legale
$inizio = mktime(0, 0, 0, $meseinizio, $giornoinizio, $annoinizio,0);
$fine = mktime(0, 0, 0, $mesefine, $giornofine, $annofine,0);
$giorni = $fine – $inizio;
$giorni = intval($giorni / 86400); /*ovvero (24*60*60)*/

Ed il gioco è fatto : - )

7 thoughts on “mktime() – Attenzione all’ora legale”

  1. mktime() – Attenzione all’ora legale
    Vi siete mai posti il problema di come calcolare la differenza fra due date in php? Lavorando in un tour operator che deve calcolare i giorni di in e out dei propri clienti dagli alberghi, la cosa è necessaria .
    Per farlo ho usato il meraviglioso[…]

  2. Ciao Donzo
    Mi trovo nella necessitàdi imparare da zero il PHP : - *
    qualche link a guide o consigli?
    Oltre ai tuoi post, naturalmente : - )

  3. $timeStamp1=mktime(0,0,0,$m1,$d1,$y1);
    $timeStamp2=mktime(0,0,0,$m2,$d2,$y2);
    $days=Round(($timeStamp2-$timeStamp1)/86400);

    (mgiombi@libero.it)

Comments are closed.