A partire dalla versione 5.2, e con ulteriori sviluppi contenuti nella 5.3, Php ha finalmente offerto un notevole supporto ad un'operazione frequente quanto complessa: la gestione delle date.
La data che arriva in formato Mysql (yyyy-mm-dd), da esporre all'utente in formato italiano (dd-mm-yyyy). L'aggiunta di un timeout, ad esempio mezz'ora, ad un timing. O il confronto tra due date.. Tutte operazioni frequenti, quasi quotidiane, ma poco supportate nei primi anni di vita di Php. Non è stato facile districarsi tra mktime() o unixtimestamp, al punto che qualche sviluppatore preferiva delegare confronti, formattazioni e operazioni sulle date ad una query al database.
Php oggi offre un supporto notevolmente migliorato, grazie sopratutto all'abbinamento tra la classe DateTime e DateInterval (quest'ultima aggiunta in php 5.3). Ecco alcuni esempi pratici.
1) Formattazione di una data
$date = new DateTime('2014-11-30 23:12:34');
echo $date->format('Y-m-d H:i:s');
echo '<hr />';
$date = new DateTime('30-11-2014 23:12:34');
echo $date->format('Y-m-d H:i:s');
echo '<hr />';
In questo esempio prendiamo in input una data e la formattiamo. E' interessante notare che la classe lavora allo stesso modo sia con il format YYYY-MM-DD che con quello DD-MM-YYYY, senza bisogno di dichiarazioni o settaggi.
2) Aggiunta di intervalli
$date = new DateTime('30-11-2014 23:12:34');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d H:i:s');
echo '<hr />';
$date = new DateTime('30-11-2014 23:12:34');
$date->add(new DateInterval('PT10H'));
echo $date->format('Y-m-d H:i:s');
echo '<hr />';
$date = new DateTime('30-11-2014 23:12:34');
$date->add(new DateInterval('P1DT10H'));
echo $date->format('Y-m-d H:i:s');
echo '<hr />';
Nel primo caso, abbiamo aggiunto 10 giorni; nel secondo 10 ore e nel terzo 1 giorno e 10 ore. E' tutto molto semplice, tranne la sigla passata come parametro all'oggetto DateInterval. La sigla P sta per "Period element", la sigla "T" per "Time element". Le sigle per indicare gli intervalli di tempo sono queste:
Y years
M months
D days
W weeks
H hours
M minutes
S seconds
Quindi, per aggiungere 1 giorno (1D) e 10 ore (10H), fermo restando il prefisso "P" che è sempre necessario, la sigla diventa
P1DT10H
Attenzione alla sigla W, le settimane vengono convertite in giorni quindi non è possibile usare W e D in una stessa espressione.
Infine, vediamo i confronti.
$date1 = new DateTime('30-11-2014 23:12:34');
$date2 = new DateTime('2014-11-30 23:12:34');
var_dump($date1 == $date2);
questo esempio stampa true nonostante il formato della data sia diverso, mentre basta cambiare un solo secondo (provate ad esempio a settare i secondi della prima data a 35 invece di 34) per ritornare un valore false.
A questo punto è semplice intuire la sintassi di altri confronti:
$date1 = new DateTime('30-11-2014 21:12:35');
$date2 = new DateTime('30-11-2014 23:12:34');
var_dump($date1 > $date2);
Che dire... era ora!!!