Date in PHP: come gestirle

20 marzo 2006

Prima o poi capita a tutti di doversi misurare con elaborazioni che coinvolgano calcoli di date e tempi. Talvolta tali calcoli sono fonte di fastidiose “emicranie”, per nostra fortuna PHP ci supporta con una serie di funzioni dedicate alla gestione del tempo. In quest’articolo ne analizzeremo alcune terminando con un’applicazione pratica: la costruzione di un semplice calendario.

Seguendo il famoso adagio “l’unione fa la forza”, sarà utile uno sguardo agli strumenti forniti dal database per decidere quando sia più opportuno farlo lavorare in luogo dell’engine PHP.

Procediamo nella trattazione rammentando che, al solito, la fonte principale di informazioni rimane la documentazione ufficiale reperibile all’indirizzo http://www.php.net/manual/en/ref.datetime.php.

Il timestamp

Il concetto fondamentale alla base della manipolazione del tempo con PHP è il timestamp ovvero il numero di secondi trascorsi dal 1 gennaio 1970 00:00:00 (la cosiddetta Unix Epoch) all’istante specificato. Per chiarire il concetto e senza voler apparire blasfemi, potremmo paragonare la Unix Epoch alla nascita di Cristo nel comune calcolo del tempo. Essa costituisce il riferimento rispetto al quale vengono espresse le date sia in senso anteriore, a.C., che posteriore, d.C.. Analogamente valori negativi del timestamp rappresentano date precedenti la Unix Epoch, mentre valori positivi rappresentano date successive.

L’intervallo di valori va’ tipicamente dal 13 dicembre 1901 20:45:54 al 19 gennaio 2038 03:14:07 che corrispondono al minimo e massimo valore rappresentabili mediante un numero intero a 32 bit con segno. Purtroppo non tutte le piattaforme trattano il timestamp allo stesso modo, in particolare chi usa Microsoft Windows si troverà limitato ai valori positivi ovvero all’intervallo 1 gennaio 1970, 19 gennaio 2038. L’utilizzo di questa grandezza semplifica sicuramente le elaborazioni, al termine sarà però necessario convertire i risultati in una rappresentazione a noi più comprensibile e familiare.

Come prima funzione prendiamo in considerazione time(), essa fornisce lo unix timestamp al momento della sua esecuzione. L’istruzione seguente stamperà il numero di secondi dalla unix epoch ad adesso sabato 19 marzo 2005 07:03:53, momento in cui sto scrivendo queste righe:

<?php
 // stamperà 1111212173
 echo time();
?>

Per ottenere il valore del timestamp corrispondente ad una particolare data possiamo ricorrere alla funzione mktime(). Tale funzione prevede 7 argomenti interi nell’ordine: ore, minuti, secondi, mese, giorno, anno ed un valore che, se specificato, comunica alla funzione come comportarsi rispetto all’ora legale o DST Daylight Saving Time. Senza dilungarci troppo con il valore 1 indichiamo che il tempo vi ricade, 0 in caso contrario, -1 (valore di default) se non lo sappiamo e vogliamo che PHP si arrangi da solo.

Supponiamo di voler conoscere il timestamp corrispondente al 12 giugno 1987 12:30 procediamo così:

<?php
 // stamperà 550492200
 echo mktime(12,30,0,6,12,1987);
?>

I valori omessi a partire da destra verranno rimpiazzati automaticamente con i valori di data e tempo correnti. Nell’esempio che segue riprendiamo la data precedente tralasciando giorno e anno finali. Otterremo il timestamp del 19 giugno 2005 12:30 dove 19 e 2005 corrispondono ai valori relativi alla data corrente 19 marzo 2005 come più sopra ricordato.

<?php
 // stamperà 1119177000
 echo mktime(12,30,0,6);
?>

La funzione mktime() risulta molto robusta e flessibile, per questo viene largamente sfruttata per calcoli aritmetici sulle date e per la validazione delle medesime. Di seguito alcuni esempi chiarificatori:

<?php
 // il timestamp di questo istante
 echo mktime();
 // il timestamp a 25 giorni dalla data specificata
 $year = 2005;
 $month = 6;
 $day = 21;
 echo mktime(0,0,0,$month,$day+25,$year);

 // il timestamp corretto del 1 gennaio 2001
 // malgrado l'errore nel mese e poi nel giorno
 echo mktime(0,0,0,13,1,2000);
 echo mktime(0,0,0,12,32,2000);

 // il timestamp dell'ultimo giorno di febbraio 2003
 // come giorno 0 di marzo 2003
 echo mktime(0,0,0,3,0,2003);
 // come giorno -31 di aprile 2003
 echo mktime(0,0,0,4,-31,2003);
?>

Possiamo anche non esprimere l’anno mediante le canoniche 4 cifre tenendo presente che i numeri tra 0 e 69 saranno interpretati come 2000-2069, mentre quelli tra 70 e 99 come 1970-1999:

<?php
 // timestamp del 1 gennaio 1977
 echo mktime(0,0,0,1,1,77);
?>

Bene, siamo convinti che il timestamp sia una grande invenzione, ma i risultati ottenuti non sono molto belli a vedersi….proseguiamo e vediamo come sia possibile migliorarne la rappresentazione.

Se vuoi aggiornamenti su Date in PHP: come gestirle inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Date in PHP: come gestirle

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy