Corso PHP/ Lezione 10: le date

La gestione delle date non è sempre così banale come sembra. Vediamo dunque come lavorare con le date in PHP attraverso brevi ma efficaci esempi


Lavorare con date ed orari è un’operazione non banale, considerata la
particolare struttura dati con cui si ha a che fare. In molte applicazioni,
tuttavia, si ha necessità di manipolare date, confrontarle, validarle e così
via. In questa lezione vedremo in che modo possiamo operare su date ed orari nei
nostri script PHP, ricorrendo ad esempi concreti.

Nel linguaggio PHP le date vengono rappresentate sotto forma di "timestamp":
un timestamp è semplicemente un numero intero che corrisponde al numero di
secondi trascorsi dalla cosiddetta "Unix epoch" (le ore 0:00:00 del
primo gennaio 1970). Ad esempio, le ore 0:00:00 del primo gennaio 2001
corrispondono al timestamp 978303600.

Per conoscere il timestamp corrispondente ad una certa data basta invocare la
funzione mktime() passandole i parametri previsti e cioè, nell’ordine,
ore, minuti, secondi, mese, giorno, anno. Un ulteriore argomento, opzionale,
consente di tener conto dell’ora legale. Vediamo quale istruzione abbiamo
utilizzato per determinare il timestamp mostrato in precedenza.

// Timestamp delle ore 0:00:00 del primo gennaio
2001

echo mktime(0, 0, 0, 1, 1, 2001);

I timestamp, naturalmente, sono poco comprensibili per un essere umano, per
cui vediamo subito in che modo si possano tradurre in una forma "human
readable". PHP ci mette a disposizione, a questo scopo, la funzione date() .
Gli argomenti di date() sono due: il primo, obbligatorio, è una stringa
che rappresenta il formato in cui codificare la data; il secondo, facoltativo,
è il timestamp da formattare. Se quest’ultimo viene omesso, verrà considerato
il timestamp corrente. Vediamo un esempio.

// Questa istruzione stampa la data corrente nel
formato gg/mm/aaaa

echo "Data di oggi " . date("d/m/Y");

Nell’esempio mostrato, la stringa che esprime il formato in cui visualizzare
la data è "d/m/Y". Ognuna delle lettere che vi compaiono corrisponde
ad un elemento della data; nel nostro caso al giorno del mese (01-31), al mese
(01-12) ed all’anno, espresso con quattro cifre. Si consulti la pagina del
manuale PHP relativa alla funzione date() per un elenco completo delle
lettere utilizzabili. Nel frattempo, divertiamoci con altri esempi.

// Come sopra ma senza lo zero prima di giorni
e/o mesi di una sola cifra

echo "Data di oggi " . date("j/n/Y");

L’esempio seguente stampa il numero di giorni trascorsi dall’inizio
dell’anno.

echo "Sono trascorsi
".date("z")." giorni dall’inizio dell’anno.";

Riprendiamo l’esempio della data corrente; come possiamo visualizzarla in
modo testuale? Ecco una possibile soluzione.

// Nomi dei giorni della settimana

$giorni = array( "Dom", "Lun", "Mar", "Mer",
"Gio", "Ven", "Sab" );

echo "Oggi e': " . $giorni[date("w")];

In modo del tutto analogo si può ottenere il nome dei mesi. Per evitare di
chiamare ripetutamente la funzione date() se ne può utilizzare un’altra,
getdate() , che restituisce le informazioni sulla data ed ora correnti in
un array associativo.


Fino ad ora abbiamo considerato operazioni estremamente semplici sulle date;
nel seguito mostriamo, invece, come eseguirne altre più evolute. In primo
luogo, vediamo come sia possibile validare una data, cioè accertarsi che si
tratti di una data valida. Per citare qualche esempio sono date non valide il 31
aprile o il 29 febbraio di un anno non bisestile. La funzione preposta alla
verifica di una data è checkdate() .

// Verifichiamo una data (31 aprile 2001!?)

$giorno = 31;

$mese = 4;

$anno = 2001;

echo "La data $giorno/$mese/$anno ";

if (checkdate($mese,$giorno,$anno)) echo "è corretta.";

else echo "non è valida!";

Supponiamo adesso di voler confrontare due date per verificare se la prima è
antecedente alla seconda. In PHP un modo rapido per risolvere il problema è
quello di convertire entrambe le date nei corrispondenti timestamp e confrontare
quelli.

// Data n° 1: ancora il primo gennaio 2001

$data1 = mktime(0, 0, 0, 1, 1, 2001, 0);

// Data n° 2: il 29 luglio 2001

$data2 = mktime(0, 0, 0, 7, 29, 2001, 0);

echo "La prima data è ";

if ($data1 < $data2) echo
"precedente";

else echo "successiva";

echo " alla seconda.";

Altrettanto semplicemente si può calcolare il numero di giorni che separa due
date arbitrarie, come mostrato nell’esempio seguente:

// Data n° 1: ancora il primo gennaio 2001

$data1 = mktime(0, 0, 0, 1, 1, 2001, 0);

// Data n° 2: il 29 luglio 2001

$data2 = mktime(0, 0, 0, 7, 29, 2001, 0);

echo "Tra le due date ci sono ";

echo ($data2 - $data1)/(60*60*24);

echo " giorni.";



La differenza tra i due timestamp, espressa in secondi, può essere convertita
in giorni dividendo per 24 ore al giorno, 60 minuti l’ora, 60 secondi al minuto.
L’unica particolarità riguarda l’ultimo parametro fornito a mktime()
impostato a zero, in modo da ignorare l’ora legale.

A questo punto non mi resta che augurarvi buon divertimento con le date e
darvi appuntamento alla prossima lezione.

Luca Balzerani , studente di
Informatica, è fondatore e presidente di LatoServer.it ,
sito dedicato alla programmazione server-side ed al backend in generale.

La tua email sarà utilizzata per comunicarti se qualcuno risponde al tuo commento e non sarà pubblicato. Dichiari di avere preso visione e di accettare quanto previsto dalla informativa privacy

  • Anonimo scrive:
    errata corrige
    Volevo solo precisare che la "limitazione" di InterDev in merito alla gestione dei linguaggi VBScript e Javascript è inesistente. InterDev e ASP, infatti, si basano su Windows Scripting Host, una astrazione del motore di script che permette la gestione di "infiniti" dialetti al costo dell'installazione di un parser specifico. E' a questo che server l'attributo LANGUAGE del tag SCRIPT.Se a qlcc interessa, infatti, è disponibile anche un ottimo parser/interprete Perl, per la gioia di chiunque provenga da Un*x.Vorrei solo ricordare a PI (del quale sono lettore sin dalla sua nascita) che l'informazione tecnica deve essere quantomeno "apolitica" (nel senso tecnico del termine) e aderente alla realtà. Altrimenti basta guardare "Porta a Porta" o "Il processo di Biscardi" (se non altro per la valletta :-) )
    • Anonimo scrive:
      Re: errata corrige
      Ehi, ragazzi!!Tra lo "Stand by" di ieri e questo "Plug-In"non ho visto una sola battuta di spirito: solo gente arrabbiata, tuttologi e fenomeni vari.Neppure cose serie ed interessanti.Si sente il cambiamento di stagione?E tu Andy, scusa per questa risposta: l'avrei potuta mettere in ognuno dei messaggi di questi due giorni. Ciao.
    • Anonimo scrive:
      Re: errata corrige

      la gestione di "infiniti" dialetti al costo
      dell'installazione di un parser specifico.Ciao,probabilmente mi sono espresso male.Ciò che è inteso nell'articolo è la limitazionedi parsing contenuta nel pacchetto, verificabilead occhio umano. Se confronti semplicemente i pacchetti di Allaire con Microsoft, balza all'occhio con un rapido sguardo.In seconda battuta, la personalizzazione del programma stesso confrontata con altri programmi a disposizione è evidente.
      Se a qlcc interessa, infatti, è disponibile
      anche un ottimo parser/interprete Perl, perOttimo, sarebbe interessante averne maggiori informazioni... sei in grado di fornirle?
      Vorrei solo ricordare a PI (del quale sono
      lettore sin dalla sua nascita) che
      l'informazione tecnica deve essere
      quantomeno "apolitica" (nel senso tecnico
      del termine) e aderente alla realtà.Se riferisci ad errori contenuti nell'articolo, sono felice di ricevere feedback utili e costruttivi (può capitare che qualcosa sfugga, ecco perchè è utile l'apporto dei lettori), non a caso è stata istituita una casella postale dedicata che ti ricordo: webtools@bazzmann.com.In quanto al fattore "apolitico", se la volontà fosse stata "politica" non sarebbe stato semplicemente pubblicato alcunchè riguardante Microsoft, enfatizzando esclusivamente quei pacchetti forniti da altre società.In merito agli articoli, vorrei ricordarti il progetto di non fornire un dettaglio prettamente tecnico, ma esporre una descrizione "operativa" dello strumento da offrire a chi deve scegliere il proprio, sperando che possa costituire un buon elemento di giudizio; se non altro di orientamento verso le potenzialità di uno o l'altro pacchetto.
      Altrimenti basta guardare "Porta a Porta" o
      "Il processo di Biscardi" (se non altro per
      la valletta :-) )Beh, se potessi avvalermi di tale valletta... sarei decisamente più distratto! :c)Ciao e grazie per il feedback!
Chiudi i commenti