+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{.8\textwidth}
+ \includestruct{listati/tm.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{tm} per una rappresentazione del tempo in
+ termini di ora, minuti, secondi, ecc.}
+ \label{fig:sys_tm_struct}
+\end{figure}
+
+Questo viene effettuato attraverso una opportuna struttura \struct{tm}, la cui
+definizione è riportata in fig.~\ref{fig:sys_tm_struct}, ed è in genere questa
+struttura che si utilizza quando si deve specificare un tempo a partire dai
+dati naturali (ora e data), dato che essa consente anche di tenere conto della
+gestione del fuso orario e dell'ora legale. In particolare gli ultimi due
+campi, \var{tm\_gmtoff} e \var{tm\_zone}, sono estensioni previste da BSD e
+supportate dalla \acr{glibc} quando è definita la macro \macro{\_BSD\_SOURCE}.
+
+Ciascuno dei campi di \struct{tm} ha dei precisi intervalli di valori
+possibili, con convenzioni purtroppo non troppo coerenti. Ad esempio
+\var{tm\_sec} che indica i secondi deve essere nell'intervallo da 0 a 59, ma è
+possibile avere anche il valore 60 per un cosiddetto \textit{leap second} (o
+\textsl{secondo intercalare}), cioè uno di quei secondi aggiunti al calcolo
+dell'orologio per effettuare gli aggiustamenti del calendario per tenere conto
+del disallineamento con il tempo solare.\footnote{per dettagli si consulti
+ \url{http://it.wikipedia.org/wiki/Leap_second}.}
+
+I campi \var{tm\_min} e\var{tm\_hour} che indicano rispettivamente minuti ed
+ore hanno valori compresi rispettivamente fra 0 e 59 e fra 0 e 23. Il campo
+\var{tm\_mday} che indica il giorno del mese prevede invece un valore compreso
+fra 1 e 31, ma la \acr{glibc} supporta pure il valore 0 come indicazione
+dell'ultimo giorno del mese precedente. Il campo \var{tm\_mon} indica il mese
+dell'anno a partire da gennaio con valori compresi fra 0 e 11.
+
+I campi \var{tm\_wday} e \var{tm\_yday} indicano invece rispettivamente il
+giorno della settimana, a partire dalla Domenica, ed il giorno dell'anno, a
+partire del primo gennaio, ed hanno rispettivamente valori compresi fra 0 e 6
+e fra 0 e 365. L'anno espresso da \var{tm\_year} viene contato come numero di
+anni a partire dal 1900. Infine \var{tm\_isdst} è un valore che indica se per
+gli altri campi si intende come attiva l'ora legale ed influenza il
+comportamento di \func{mktime}.
+
+
+Le funzioni per la gestione del \textit{broken-down time} sono varie e vanno
+da quelle usate per convertire gli altri formati in questo, usando o meno
+l'ora locale o il tempo universale, a quelle per trasformare il valore di un
+tempo in una stringa contenente data ed ora. Le prime due funzioni,
+\funcd{asctime} e \funcd{ctime} servono per poter stampare in forma leggibile
+un tempo, i loro prototipi sono:
+
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{char * asctime(const struct tm *tm)}
+\fdesc{Converte un \textit{broken-down time} in una stringa.}
+\fdecl{char * ctime(const time\_t *timep)}
+\fdesc{Converte un \textit{calendar time} in una stringa.}
+}
+
+{Le funzioni ritornano un puntatore al risultato in caso di successo e
+ \val{NULL} per un errore, \var{errno} non viene modificata.}
+\end{funcproto}
+
+Le funzioni prendono rispettivamente come argomenti i puntatori ad una
+struttura \struct{tm} contenente un \textit{broken-down time} o ad una
+variabile di tipo \type{time\_t} che esprime il \textit{calendar time},
+restituendo il puntatore ad una stringa che esprime la data, usando le
+abbreviazioni standard di giorni e mesi in inglese, nella forma:
+\begin{Example}
+Sun Apr 29 19:47:44 2012\n"
+\end{Example}
+
+Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione
+di una \textit{timezone} e effettua una chiamata preventiva a \func{tzset}
+(che vedremo a breve), in modo che la data espressa tenga conto del fuso
+orario. In realtà \func{ctime} è banalmente definita in termini di
+\func{asctime} come \code{asctime(localtime(t)}.
+
+Dato che l'uso di una stringa statica rende le funzioni non rientranti
+POSIX.1c e SUSv2 prevedono due sostitute rientranti, il cui nome è al solito
+ottenuto aggiungendo un \code{\_r}, che prendono un secondo argomento
+\code{char *buf}, in cui l'utente deve specificare il buffer su cui la stringa
+deve essere copiata (deve essere di almeno 26 caratteri).
+
+Per la conversione fra \textit{broken-down time} e \textit{calendar time} sono
+invece disponibili altre tre funzioni, \funcd{gmtime}, \funcd{localtime} e
+\funcd{mktime} i cui prototipi sono:
+
+\begin{funcproto}{
+\fdecl{struct tm * gmtime(const time\_t *timep)}
+\fdesc{Converte un \textit{calendar time} in un \textit{broken-down time} in
+ UTC.}
+\fdecl{struct tm * localtime(const time\_t *timep)}
+\fdesc{Converte un \textit{calendar time} in un \textit{broken-down time}
+ nell'ora locale.}
+\fdecl{time\_t mktime(struct tm *tm)}
+\fdesc{Converte un \textit{broken-down time} in un \textit{calendar time}.}
+
+}
+
+{Le funzioni ritornano un puntatore al risultato in caso di successo e
+ \val{NULL} per un errore, tranne tranne che \func{mktime} che restituisce
+ direttamente il valore o $-1$ in caso di errore, \var{errno} non viene
+ modificata.}
+\end{funcproto}
+
+Le le prime funzioni, \func{gmtime}, \func{localtime} servono per convertire
+il tempo in \textit{calendar time} specificato da un argomento di tipo
+\type{time\_t} restituendo un \textit{broken-down time} con il puntatore ad
+una struttura \struct{tm}. La prima effettua la conversione senza tenere conto
+del fuso orario, esprimendo la data in tempo coordinato universale (UTC), cioè
+l'ora di Greenwich, mentre \func{localtime} usa l'ora locale e per questo
+effettua una chiamata preventiva a \func{tzset}.
+
+Anche in questo caso le due funzioni restituiscono l'indirizzo di una
+struttura allocata staticamente, per questo sono state definite anche altre
+due versioni rientranti (con la solita estensione \code{\_r}), che prevedono
+un secondo argomento \code{struct tm *result}, fornito dal chiamante, che deve
+preallocare la struttura su cui sarà restituita la conversione. La versione
+rientrante di \func{localtime} però non effettua la chiamata preventiva a
+\func{tzset} che deve essere eseguita a cura dell'utente.
+
+Infine \func{mktime} esegue la conversione di un \textit{broken-down time} a
+partire da una struttura \struct{tm} restituendo direttamente un valore di
+tipo \type{time\_t} con il \textit{calendar time}. La funzione ignora i campi
+\var{tm\_wday} e \var{tm\_yday} e per gli altri campi normalizza eventuali
+valori fuori degli intervalli specificati in precedenza: se cioè si indica un
+12 per \var{tm\_mon} si prenderà il gennaio dell'anno successivo. Inoltre la
+funzione tiene conto del valore di \var{tm\_isdst} per effettuare le
+correzioni relative al fuso orario: un valore positivo indica che deve essere
+tenuta in conto l'ora legale, un valore nullo che non deve essere applicata
+nessuna correzione, un valore negativo che si deve far ricorso alle
+informazioni relative al proprio fuso orario per determinare lo stato dell'ora
+legale.
+
+La funzione inoltre modifica i valori della struttura \struct{tm} in forma di
+\textit{value result argument}, normalizzando i valori dei vari campi,
+impostando i valori risultanti per \var{tm\_wday} e \var{tm\_yday} e
+assegnando a \var{tm\_isdst} il valore (positivo o nullo) corrispondente allo
+stato dell'ora legale. La funzione inoltre provvede ad impostare il valore
+della variabile globale \var{tzname}.
+
+\itindend{calendar~time}
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{.75\textwidth}
+ \includestruct{listati/time_zone_var.c}
+ \end{minipage}
+ \normalsize
+ \caption{Le variabili globali usate per la gestione delle
+ \textit{timezone}.}
+ \label{fig:sys_tzname}
+\end{figure}
+
+Come accennato l'uso del \textit{broken-down time} permette di tenere conto
+anche della differenza fra tempo universale e ora locale, compresa l'eventuale
+ora legale. Questo viene fatto dalle funzioni di conversione grazie alle
+informazioni riguardo la propria \textit{timezone} mantenute nelle tre
+variabili globali mostrate in fig.~\ref{fig:sys_tzname}, cui si si può
+accedere direttamente includendo \headfile{time.h}. Come illustrato queste
+variabili vengono impostate internamente da alcune delle delle precedenti
+funzioni di conversione, ma lo si può fare esplicitamente chiamando
+direttamente la funzione \funcd{tzset}, il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{void tzset(void)}
+\fdesc{Imposta le variabili globali della \textit{timezone}.}
+}
+
+{La funzione non ritorna niente e non dà errori.}
+\end{funcproto}
+
+La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire
+dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è
+definita verrà usato il file \conffiled{/etc/localtime}. La variabile
+\var{tzname} contiene due stringhe, che indicano i due nomi standard della
+\textit{timezone} corrente. La prima è il nome per l'ora solare, la seconda
+per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come
+\code{char *} non è il caso di modificare queste stringhe. La variabile
+\var{timezone} indica la differenza di fuso orario in secondi, mentre
+\var{daylight} indica se è attiva o meno l'ora legale.
+
+Benché la funzione \func{asctime} fornisca la modalità più immediata per
+stampare un tempo o una data, la flessibilità non fa parte delle sue
+caratteristiche; quando si vuole poter stampare solo una parte (l'ora, o il
+giorno) di un tempo si può ricorrere alla più sofisticata \funcd{strftime},
+il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{size\_t strftime(char *s, size\_t max, const char *format,
+ const struct tm *tm)}
+\fdesc{Crea una stringa con una data secondo il formato indicato.}
+}
+
+{La funzione ritorna il numero di caratteri inseriti nella stringa \param{s}
+ oppure $0$, \var{errno} non viene modificata.}
+\end{funcproto}
+
+
+La funzione converte il \textit{broken-down time} indicato nella struttura
+puntata dall'argomento \param{tm} in una stringa di testo da salvare
+all'indirizzo puntato dall'argomento \param{s}, purché essa sia di dimensione
+inferiore al massimo indicato dall'argomento \param{max}. Il numero di
+caratteri generati dalla funzione viene restituito come valore di ritorno,
+senza tener però conto del terminatore finale, che invece viene considerato
+nel computo della dimensione. Se quest'ultima è eccessiva viene restituito 0 e
+lo stato di \param{s} è indefinito.
+
+\begin{table}[htb]
+ \footnotesize
+ \centering
+ \begin{tabular}[c]{|c|l|p{6cm}|}
+ \hline
+ \textbf{Modificatore} & \textbf{Esempio} & \textbf{Significato}\\
+ \hline
+ \hline
+ \var{\%a}&\texttt{Wed} & Nome del giorno, abbreviato.\\
+ \var{\%A}&\texttt{Wednesday} & Nome del giorno, completo.\\
+ \var{\%b}&\texttt{Apr} & Nome del mese, abbreviato.\\
+ \var{\%B}&\texttt{April} & Nome del mese, completo.\\
+ \var{\%c}&\texttt{Wed Apr 24 18:40:50 2002}& Data e ora.\\
+ \var{\%d}&\texttt{24} & Giorno del mese.\\
+ \var{\%H}&\texttt{18} & Ora del giorno, da 0 a 24.\\
+ \var{\%I}&\texttt{06} & Ora del giorno, da 0 a 12.\\
+ \var{\%j}&\texttt{114} & Giorno dell'anno.\\
+ \var{\%m}&\texttt{04} & Mese dell'anno.\\
+ \var{\%M}&\texttt{40} & Minuto.\\
+ \var{\%p}&\texttt{PM} & AM/PM.\\
+ \var{\%S}&\texttt{50} & Secondo.\\
+ \var{\%U}&\texttt{16} & Settimana dell'anno (partendo dalla
+ domenica).\\
+ \var{\%w}&\texttt{3} & Giorno della settimana.\\
+ \var{\%W}&\texttt{16} & Settimana dell'anno (partendo dal
+ lunedì).\\
+ \var{\%x}&\texttt{04/24/02} & La data.\\
+ \var{\%X}&\texttt{18:40:50} & L'ora.\\
+ \var{\%y}&\texttt{02} & Anno nel secolo.\\
+ \var{\%Y}&\texttt{2002} & Anno.\\
+ \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\
+ \var{\%\%}&\texttt{\%} & Il carattere \%.\\
+ \hline
+ \end{tabular}
+ \caption{Valori previsti dallo standard ANSI C per modificatore della
+ stringa di formato di \func{strftime}.}
+ \label{tab:sys_strftime_format}
+\end{table}
+
+Il risultato della funzione è controllato dalla stringa di formato
+\param{format}, tutti i caratteri restano invariati eccetto \texttt{\%} che
+viene utilizzato come modificatore. Alcuni dei possibili valori che esso può
+assumere sono riportati in tab.~\ref{tab:sys_strftime_format}.\footnote{per la
+ precisione si sono riportati definiti dallo standard ANSI C, che sono anche
+ quelli ripresi in POSIX.1; le \acr{glibc} forniscono anche le estensioni
+ introdotte da POSIX.2 per il comando \cmd{date}, i valori introdotti da
+ SVID3 e ulteriori estensioni GNU; l'elenco completo dei possibili valori è
+ riportato nella pagina di manuale della funzione.} La funzione tiene conto
+anche delle eventuali impostazioni di localizzazione per stampare i vari nomi
+in maniera adeguata alla lingua scelta, e con le convenzioni nazionali per i
+formati di data ed ora.
+
+Infine per effettuare l'operazione di conversione inversa, da una stringa ad
+un \textit{broken-down time}, si può utilizzare la funzione \funcd{strptime},
+il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{time.h}
+\fdecl{char *strptime(const char *s, const char *format, struct tm *tm)}
+\fdesc{Converte una stringa con in un \textit{broken-down time} secondo un
+ formato.}
+}
+
+{La funzione ritorna il puntatore al primo carattere non processato della
+ stringa o al terminatore finale qualora questa sia processata interamente,
+ \var{errno} non viene modificata.}
+\end{funcproto}
+
+La funzione processa la stringa puntata dall'argomento \param{s} da sinistra a
+destra, utilizzando il formato contenuto nella stringa puntata
+dall'argomento \param{format}, avvalorando volta volta i corrispondenti campi
+della struttura puntata dall'argomento \param{tm}. La scansione si interrompe
+immediatamente in caso di mancata corrispondenza a quanto indicato nella
+stringa di formato, che usa una sintassi analoga a quella già vista per
+\func{strftime}. La funzione supporta i modificatori di
+tab.~\ref{tab:sys_strftime_format} più altre estensioni, ma per i dettagli a
+questo riguardo si rimanda alla lettura della pagina di manuale.
+
+Si tenga presente comunque che anche in caso di scansione completamente
+riuscita la funzione sovrascrive soltanto i campi di \param{tm} indicati dal
+formato, la struttura originaria infatti non viene inizializzati e gli altri
+campi restano ai valori che avevano in precedenza.
+
+
+\itindend{broken-down~time}