Manipolare la data e l'ora
Tecniche che devi affinare
- Manipolare le date
- Ottenere la data corrente
- Convertire una stringa in una data
- Formattare le date e gli orari
Come manipolare le date
In PHP, puoi lavorare conle date in tre diversi formati
- Timestamp UNIX
- Array Data
- Date in formato stringa
Internamente, PHP usa lo Unix Timestamp, che è il metodo standard di richiamare le date in sistemi
unix. Il timestamp di unix dice quanti secondi sono passati dallo
Unix Epoch
che è definito al 1 Gennaio 1970 alle 00:00:00 in Coordinated Universal Time (abbreviato UTC).
Il timestamp attuale è 1159905341 che corrisponde alle 21:56 circa del 03/10/2006 (in Italia)
Come per UNIX, php lavora con le date allo stesso modo: tramite il timestamp. Questo può essere
convertito in una data e una data può essere convertita in un timestamp: questo è un
ottimo punto di incontro. Siccome il timestamp è un integer, PHP può elaborare date dal
1970 al 2038 (per sistemi a 32 bit. per sistemi a 64 bit la data si estende indefinitivamente)
Un formato più leggibile per la data in PHP è il formato interno dell'array
data. Questo è un array che contiene le seguenti coppie chiave/valore:
| Chiave | Valore |
| seconds | Numero di secondi (0-59) |
| minutes | Numero dei minuti (0-59) |
| hours | Numero delle ore (0-23) |
| mday | Giorno del mese (1-31) |
| mon | Mese dell'anno (1-12) |
| year | Anno |
| wday | Giorno della settimana (0-6) |
| yday | Giorno dell'anno (0-366) |
| weekday | Rappresentazione testuale del giorno della settimana (Lunedì-Domenica) |
| month | Rappresentazione testuale del mese (Gennaio-Dicembre) |
Addizionalmente PHP, supporta anche la scrittura di diversi formati di stringhe data. Stringhe di data
formattate sono di solito utilizzate per la presentazione ma non vengono quasi mai memorizzate formattate
perchè più lenti da ordinare rispetto al timestamp di unix.
Ottenere il timestamp corrente
Il modo più facile di ottenere timestamp in PHP è quello di chiamare la funzione
time(). Qui abbiamo un esempio che stampa il valore:
print "Attuale timestamp è " . time();
Se semplicemente i secondi non bastano puoi utilizzare la funzione gettimeofday() per ottenere più
precisione in un array:
| sec | Il corrente timestamp |
| usec | Il numero di microsecondi dopo sec |
I microsecondi di gettimeofday() sono molto importanti per la precisione.
function get_timer() {
$tm = gettimeofday();
return $tm['sec'] + ($tm['usec']/1000000);
}
$start = get_timer();
sleep(1);
$finish = get_timer();
print "sleep(1) ha impiegato" . ($finish - $start) . " secondi";
Ottenere un array data
Per ottenere un array data, puoi usare la funzione getdate(). La funzione getdate() prende
come primo argomento un timestamp unix e ritorna e ritorna il timestamp in un array contenente
quel timestamp nel formato orario della tua zona. Se non passi nessun argomento alla funzione
getdate() di default il timestamp corrente viene preso. Ecco un esempio:
$now = getdate();
print_r( $now );
output:
Array (
[seconds] => 37
[minutes] => 23
[hours] => 21
[mday] => 5
[wday] => 4
[mon] => 10
[year] => 2006
[weekday] => Thursday
[month] => November
[0] => 1086467017
)
Nota che il timestamp viene inserito all'index 0.
Opzionalmente, puoi usare anche localtime() che mima la funzione in C. localtime() è
pressapoco identica a getdate() con qualche importante differenza:
- di default, l'array non è associativo
- il range dei mesi va da 0 a 11 (Gennaio è 0)
- L'anno viene contato partendo da 1900. Quindi il 2006 è 106
Formattare le date
Per creare una data formattata da un timestamp, PHP offre due famiglie di funzioni: date() e strftime(). Entrambe
fanno le stesse operazioni di base, ma differiscono per le costanti utilizzate per formattare la data.
Analizziamo la prima. date() prende come primo argomento una stringa di formattazione e un timestamp
come secondo argomento. Ecco la lista delle costanti per formattare la data con date():
| Caratteri | Descrizione |
| a | am/pm lowercase |
| A | AM/PM uppercase |
| d | Giorno del mese (01-31) | |
| D | Abbreviazione del giorno in tre lettere (lun-dom) |
| F | Nome del mese (Gennaio--Dicembre) |
| g | Ora (formato 12 ore) senza zero iniziale (1-12) |
| G | Ora (formato 24 ore) senza zero iniziale (0-23) |
| h | Ora (formato 12 ore) con zero iniziale (01-12) |
| H | Ora (formato 24 ore) con zero iniziale (00-23) |
| i | Minuti con zero iniziali (00-59) |
| j | Giorno del mese senza zeri iniziali (1-31) |
| l | Giorno della settimama (Lunedì-Domenica) |
| m | Numero del mese con zero iniziale (01-12) |
| M | Mese abbreviazione a tre lettere (Gen-Dic) |
| n | Numero del mese senza zero iniziale (1-12) |
| r | RFC 2822: tipo di data |
| s | Secondi con zero iniziali (00-59) |
| t | Numero di giorni nel mese corrente |
| U | Timestamp Unix |
| w | Giorno della settimana (0-6) |
| Y | Anno a quattro cifre (Es. 2006) |
| y | Anno a due cifre (Es. 06) |
| z | Giorno dell'anno (0-365) |
Il seguente codice dirà "Sono le 10:18 PM"
print "Sono le " . date("h:i A");
Quando formatti una data con le costanti, tutti i caratteri non riconosciuti verranno stampati. Se vuoi
stampare un carattere, invece, che è presente nelle costanti di formattazione devi usare il carattere
di escape \.
La funzione date() permette moltissime formattazioni diverse del timestamp ma soffre su almeno
due punti:
- Se devi usare dei caratteri all'interno della data diventa tutto molto complesso con i caratteri
di escape
- Tutti i nomi ritornati sono in Inglese
Per rimediare a questo problema puoi usare la funzione strftime() che lavora esattamente come
date() eccetto per le stringhe di formattazione che sono come quelle di C.
| Caratteri | Descrizione |
| %a | Nome del giorno a tre lettere (Lun-Dom) |
| %A | Nome del giorno completo |
| %b | Nome del mese a tre lettere | |
| %B | Nome del mese completo |
| %c | L'espressione preferita della data in locale |
| %C | Numero del secolo |
| %d | Giorno del mese con zero iniziale (01-31) |
| %D | Shortcut per %m/%d/%y |
| %h | Nome del mese a tre lettere |
| %H | Ora (formato 24 ore) con zero iniziale (00-23) |
| %I | Ora (formato 12 ore) con zero iniziale (01-12) |
| %j | Giorno dell'anno (001-366) |
| %m | Mese con zero iniziale (01-12) |
| %M | Minuti con zero iniziale (00-59) |
| %n | Newline (\n) |
| %p | Anti meridian/post meridian |
| %r | Orario in formato a.m./p.m. |
| %R | Orario in formato 24 ore |
| %s | Unix timestamp |
| %S | Secondi con zero iniziale (00-59) |
| %t | Tab (\t) |
| %T | Come %H:%M:%S |
| %u | Giorno della settimana a numero (1-7) 1 è lunedì |
| %U | Numero della settimana dell'anno(00-53 iniziando dalla prima domenica) |
| %W | Numero della settimana dell'anno(00-53 iniziando dal primo lunedì) |
| %x | La rappresentazione locale preferita per la data |
| %X | La rappresentazione locale preferita per l'orario |
| %y | Anno a due cifre |
| %Y | Anno a quattro cifre |
| %Z | Abbreviazione del TimeZone |
| %% | Un % |
I token per la formattazione della funzione strftime() permettono di utilizzare il testo all'interno molto più comodamente
rispetto alla funzione date. Eccone un esempio:
$locale = setlocale( LC_TIME, NULL);
echo strftime("La data corrente nel locale $locale è %A\n");
// settiamo il locale al francese
$locale = setlocale( LT_TIME, "fr_FR");
echo strftime("La data corrente nel locale $locale è %A\n");
Considerando le impostazioni locali l'output è
La data corrente nel locale it_IT è Venerdì
La data corrente nel locale fr_FR è Vendredì
Similarmente a date(), strftime() prende un UNIX timestamp per usarlo come secondo parametro.
Il seguente è un codice che stampa in forma abbreviata i prossimi 7 giorni:
for( $i = 0; $i < 7; $i++) {
print strftime( "%a\n", time() + $i*60*60*24);
}
Ottenere Timestamp da un array DATA
Per ottenere un Unix timestamp per una data rappresentata da un array,
puoi usare la funzione mktime(). mktime() prende i seguenti argomenti (tutti facoltativi):
mktime([int hour] [, int minute [, int seconds [, int month [, int day
[, int year [, int dst]]]]]]);
Se uno di questi argomenti viene omesso il valore attuale viene preso in considerazione.
Esempio: per ottenere il timestamp del primo giorno dell'anno duemila la funzione sarà
mktime(0, 0, 0, 1, 1, 2000);
Per conoscere il timestamp delle 15 di oggi basterà
mktime(15, 0, 0).
Gli argomenti non specificati saranno automaticamente presi dal valore attuale (ovvero quelli giusti).
Torna su ^