Zend_Date

Parliamo di date!
La maggior parte dei programmatori avrà senza dubbio avuto a che fare con la gestione delle date, il più delle volte salvate nel database. Date, DateTime, Unix Timestamp. Ognuno ha il suo modo di salvarle e il suo modo di utilizzarle. La riconversione a volte può non essere facilissima, macchinosa, specie se si tratta di manipolare stringhe di date più complesse come quelle di tipo RFC_3339 che vengono espresse come 2010-11-02T10:22:01+01:00. Si ripresenta il problema delle date su progetti molto ampi, multilingua: voi tutti sapete che ogni nazione può avere il proprio modo di scrivere le date.

La soluzione a tutti i nostri problemi? Zend_Date!

Contenuta nello Zend Framework, la classe Zend_Date ci offre un vasto numero di funzioni che permettono di gestire al meglio le nostre date, adattandosi oltretutto alla lingua dell’utente: dal semplice nome del giorno della settimana, al cambio da dC (dopo Cristo) a AD (Anno Domini – Inglese).

L’utilizzo è veramente semplice! Vediamo il funzionamento di base

<?php
require 'Zend/Date.php';

$data = new Zend_Date(); //ora attuale

A questo punto potremo dare in output la data in due modi: uno con un semplice echo, grazie al metodo speciale __toString() che permette di “stampare l’oggetto”; l’altro è richiamando il metodo get() come nell’esempio seguente:

echo $data;  //output: 02/nov/2010 23.51.44
echo $data>get(); //output: 1288738304

Vi chiederete: e dove sono la flessibilità e le potenzialità sopra citate? Eccovi serviti!

echo $data->get(Zend_Date::DATE_FULL); //output: martedì 2 novembre 2010
echo $data->get(Zend_Date::MONTH_NAME); //output: novembre

Il metodo get() accetta un parametro stringa facilmente utilizzabile attraverso le costanti definite dentro la classe Zend_Date.In questo modo è possibile stampare la data in diversi modi, l’orario, le singole parti che lo compongono e le caratteristiche come il fuso orario.

Per una migliore organizzazione rimando a fondo articolo la tabella con tutte le costanti e il tipo di output. Vai.

Non sempre capita di dover utilizzare l’ora corrente, quindi vediamo come impostare una data

$data->set('13:00:00', Zend_Date::TIMES);

Con il metodo set() possiamo impostare una data al nostro oggetto. Impostare non è il termine appropriato, visto che mediante l’uso di questa funzione verrà modificata la data in memoria (quella attuale). Con l’esempio precedente, facendo un echo $data; avremo in output 02/nov/2010 13.00.00. L’utilizzo del metodo è molto semplice e ci consente di dare in pasto alla nostra classe un gran numero di tipi di date. Il primo parametro è quello contenente la nuova data/ora, il secondo è il formato che gli passiamo: anche in questo caso ci tornano utili le costanti definite all’interno della classe.
Nell’esempio abbiamo detto di impostare come ’13:00:00′ l’orario. Ma possiamo fare di più:

$dataPubblicazione = "Tue, 02 Nov 2010 23:49:33 +0100"; //tipo di data specifico dei Feed RSS
$data->set($dataPubblicazione, Zend_Date::RSS); //Imposto la data e il formato
echo $data; //output: 02/nov/2010 23.49.33

Rimando alla tabella a fondo articolo per tutte le costanti con gli esempi di formato.

Procedendo ora in maniera più spedita, passiamo a due semplici metodi: add() e sub(), ovvero somma e sottrazione. Anche questa volta sarà più facile di quanto possa sembrare! Addio calcoli, resti, riporti! Basterà dare il valore e il formato in cui lo si passa (tale e quale al set() ) e il nostro oggetto cambierà la sua data!

$data = new Zend_Date();
<pre>$data->add("12:00:00", Zend_Date::TIMES);
echo $data; //output: 03/nov/2010 11.51.44
$data->sub("12:00:00", Zend_Date::TIMES);
echo $data; //output: 02/nov/2010 23.51.44

Se abbiamo bisogno di fare comparazioni con l’ora in oggetto, Zend_Date mette a disposizione una serie di funzioni che possono semplificarci la vita

if ($date->compare(10,  Zend_Date::MINUTE) == -1)
 echo "Quest'ora non è ancora arrivata a 10 minuti";
else
 echo "Quest'ora ha già passato i 10 minuti";

if ($date->equals(10, Zend_Date::HOUR))
 echo "Sono le 10";
else
 echo "Non sono le 10";

La differenza sostanziale tra i metodi compare() e equals() è che il primo restituisce 0 se l’uguaglianza è vera, 1 se la data è maggiore di quella passata, -1 se è minore; mentre il secondo restituisce semplicemente true o false. Per favorire le comparazioni tra la data dell’oggetto e la data attuale, vi sono i seguenti metodi privi di parametri che restituiscono Vero o Falso: isToday(), isTomorrow(), isYesterday(), isLeapYear().

E se un oggetto vi pare eccessivo per visualizzare semplicemente l’ora attuale, utilizziamo il metodo statico now() passandogli il formato in cui lo vogliamo.

$data = Zend_Date::now(Zend_Date::DATE_FULL); //Semplice stringa

Spero d’aver introdotto chiaramente le funzionalità di questa classe e vi lascio con la tabella con i formati.

Formati ed Esempi

Costante Formato Esempio
Zend_Date::ATOM 2010-11-02T23:51:44+01:00
Zend_Date::COOKIE Tuesday, 02-Nov-10 23:51:44 System/Localtime
Zend_Date::DATES 02/nov/2010
Zend_Date::DATETIME 02/nov/2010 23.51.44
Zend_Date::DATETIME_FULL martedì 2 novembre 2010 23.51.44 System/Localtime
Zend_Date::DATETIME_LONG 02 novembre 2010 23.51.44 CET
Zend_Date::DATETIME_MEDIUM 02/nov/2010 23.51.44
Zend_Date::DATETIME_SHORT 02/11/10 23.51
Zend_Date::DATE_FULL martedì 2 novembre 2010
Zend_Date::DATE_LONG 02 novembre 2010
Zend_Date::DATE_MEDIUM 02/nov/2010
Zend_Date::DATE_SHORT 02/11/10
Zend_Date::DAY 02
Zend_Date::DAYLIGHT 0
Zend_Date::DAY_OF_YEAR 305
Zend_Date::DAY_SHORT 2
Zend_Date::DAY_SUFFIX nd
Zend_Date::ERA dC
Zend_Date::ERA_NAME d.C
Zend_Date::ERA_NARROW d.
Zend_Date::GMT_DIFF +0100
Zend_Date::GMT_DIFF_SEP +01:00
Zend_Date::HOUR 23
Zend_Date::HOUR_AM 11
Zend_Date::HOUR_SHORT 23
Zend_Date::HOUR_SHORT_AM 11
Zend_Date::ISO_8601 2010-11-02T23:51:44+01:00
Zend_Date::LEAPYEAR 0
Zend_Date::MERIDIEM p.
Zend_Date::MILLISECOND 0
Zend_Date::MINUTE 51
Zend_Date::MINUTE_SHORT 51
Zend_Date::MONTH 11
Zend_Date::MONTH_DAYS 30
Zend_Date::MONTH_NAME novembre
Zend_Date::MONTH_NAME_NARROW n
Zend_Date::MONTH_NAME_SHORT nov
Zend_Date::MONTH_SHORT 11
Zend_Date::RFC_1036 Tue, 02 Nov 10 23:51:44 +0100
Zend_Date::RFC_1123 Tue, 02 Nov 2010 23:51:44 +0100
Zend_Date::RFC_2822 Tue, 02 Nov 2010 23:51:44 +0100
Zend_Date::RFC_3339 2010-11-02T23:51:44+01:00
Zend_Date::RFC_822 Tue, 02 Nov 10 23:51:44 +0100
Zend_Date::RFC_850 Tuesday, 02-Nov-10 23:51:44 System/Localtime
Zend_Date::RSS Tue, 02 Nov 2010 23:51:44 +0100
Zend_Date::SECOND 44
Zend_Date::SECOND_SHORT 44
Zend_Date::SWATCH 994
Zend_Date::TIMES 23.51.44
Zend_Date::TIMESTAMP 1288738304
Zend_Date::TIMEZONE CET
Zend_Date::TIMEZONE_NAME System/Localtime
Zend_Date::TIMEZONE_SECS 3600
Zend_Date::TIME_FULL 23.51.44 System/Localtime
Zend_Date::TIME_LONG 23.51.44 CET
Zend_Date::TIME_MEDIUM 23.51.44
Zend_Date::TIME_SHORT 23.51
Zend_Date::W3C 2010-11-02T23:51:44+01:00
Zend_Date::WEEK 44
Zend_Date::WEEKDAY martedì
Zend_Date::WEEKDAY_8601 2
Zend_Date::WEEKDAY_DIGIT 2
Zend_Date::WEEKDAY_NAME mar
Zend_Date::WEEKDAY_NARROW m
Zend_Date::WEEKDAY_SHORT mar
Zend_Date::YEAR 2010
Zend_Date::YEAR_8601 2010
Zend_Date::YEAR_SHORT 10
Zend_Date::YEAR_SHORT_8601 10
differenza



Ti è piaciuto l'articolo? Vota Ok oppure No. Grazie Mille!

Post Correlati:

Resta aggiornato abbonandoti al feed RSS 2.0. Puoi lasciare un commento oppure inviare un trackback dal tuo sito.

Lascia un Commento

XHTML: È possibile utilizzare questi marcatori: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>