Banner Shishii
Pagina aggiornata il:  15/01/2005 11:42

Pagina Stampabile     Pagina Stampabile

Data e Ora

Molto spesso il programmatore ha il problema di formattare e visualizzare in maniera personalizzata una data.

Esistono molti moduli Perl che, in varie forme, consentono di manipolare le date. Se si fa una ricerca con la chiave "Date" su CPAN si ottengono più di 60 moduli principali!

Non ostante ciò ho scritto delle funzioni che consentono di formattare a piacere, e in qualunque lingua, una data.

L'ho fatto sia perchè ognuno si trova sempre meglio con il suo codice, sia perchè è una buona occasione per spiegare un pò di programmazione.


Due strade

In questi casi sono possibile due strade:


Usare la programmazione funzionale e quindi creare una subroutine.
Usare la programmazione ad oggetti (OOP) e quindi creare una classe, che in genere in Perl viene inclusa in un modulo.

Funzionano entrambe, e la scelta è solo una questione di gusti. Se si tratta un progetto grosso e vi lavorano più persone sarebbe da preferire la OOP.


Concetti comuni

Una data in Perl si ricava sempre tramite la funzione localtime(), che accetta un intero che rappresenta il formato UNIX del tempo, cioè il numero di secondi trascorso dal 01/01/1970 ad un certo momento. Questo intero è generato dalla funzione time.

La funzione localtime(time) restituisce un array di nove elementi:


($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = 
(localtime(time))[0..8];

e quindi si ottengono i seguenti valori:


$sec : secondi
$min : minuti
$hour : ore
$mday : giorno del mese
$mon : mese, ma con numerazione da 0 a 11
$year : anno, ma dal 1900 in poi, cioè il 1986 sarà "86" e il 2004 sarà "104"
$wday : giorno della settimana in senso numerico da 0 a 6
$yday : giorno dell'anno
$isdst : 1 se ora legale, 0 se ora solare

lavorando su questi dati è possibile ottenere qualunque formattazione si desidera. Si tenga presente però che i nomi dei giorni della settimana e dei mesi dovremo fornirli noi. Il metodo migliore è creare due array, nei quali l'indice coincida con il nome di riferimento, e in questo ci aiuta il fatto che, sia nel caso dei giorni della settimana, che in quello dei mesi Perl li numera partendo da 0. Per cui avremo:


my @days   = ('Sunday','Monday','Tuesday','Wednesday',
              'Thursday','Friday','Saturday');
my @months = ('January','February','March','April','May',
              'June','July','August','September','October',
              'November','December');

Quindi, se localtime() ha restituito $wday = 5 e $mon = 8 avremo che $days[$wday] e $month[$mon] ci daranno i nomi del giorno della settimana, e del mese esatti, cioè Venerdì e Settembre.


Stringa di formattazione e segna posto

La chiave del sistema è comunque la possibilità di usare una stringa di formattazione arbitraria, in cui i dati del tempo (giorno, mese, ora, ecc.) vengono inseriti tramite dei segnaposto. Ad esempio la stringa di formattazione


L'anno %Y nel mese di %n il giorno %d 
alle ore %h e %m è scoppiata la guerra.

produrrà come risultato

L'anno 2004 nel mese di Ottobre il giorno 30 
alle ore 22 e 30 è scoppiata la guerra.

Quindi è sufficiente inserire nella stringa che ci serve i segnaposto relativi al tipo di dato temporale che vogliamo nella posizione desiderata. La tabella dei segnaposto è la seguente:


tabella di formattazione
%s = secondi;
%m = minuti
%h = ore
%d = giorno del mese
%M = mese numerico
%n = mese nome
%y = anno due cifre
%Y = anno 4 cifre
%w = giorno della settimana numerico
%W = giorno della settimana nome
%a = giorno dell'anno
%i = "Ora legale" se ora legale, 
"Ora solare" se non è ora legale

Le due possibilità

Vediamo ora le due possibilità suddette per risolvere il problema: la programmazione funzionale e quella ad oggetti. In entrambe i casi avremo due file, il primo è il con il codice utilizzatore ed il secondo con il codice che elabora la data, che nel primo caso sarà una subroutine nel secondo una classe.

Il codice è scaricabile in Download - Sezione Script Perl


Programmazione funzionale
Spiegazione del funzionamento della subroutine data_ora(), utilizzata per formattare in modo personalizzato una data.

Programmazione ad oggetti
Spiegazione del funzionamento del modulo - classe DataOra.pm, utilizzato per formattare in modo personalizzato una data.


Indice del sito