Calcoli con le date

L'esempio seguente mostra, all'interno di una pagina web, la data odierna.

Il codice PHP, ospitato in una pagina HTML, deve essere racchiuso tra
il marcatore di apertura <?php
e il marcatore di chiusura ?>.

Il seguente è un esempio utile per verificare se il server web interpreta gli script php:



Salvare la pagina con il nome oggi.php, nella cartella www, o in una sua sottocartella.
Attenzione: se si tenta di eseguire lo script con il doppio clic, il sistema operativo chiederà con quale applicazione leggere il file.

Il procedimento corretto è di scrivere il nome del file nella barra degli indirizzi del browser: http://localhost/oggi.php,


La funzione Date().

Sintassi:

string date( string $formato [, int timestamp ])

La funzione date() restituisce una data sotto forma di stringa, nel formato espresso dal primo parametro ($formato). Il secondo parametro, opzionale, è un intero da 32 bit che contiene la codifica di una data.
Un intero di 32 bit può contare fino a circa 4 miliardi. Considerando che in un anno ci sono 31.536.000 secondi, si trova che 4 miliardi di secondi corrispondono a 137 anni. Fissata la data iniziale al 13-12-1901, la massima data che si può codificare è il 19-01-2038.

Se il secondo parametro non viene fornito, si usa la data corrente.

Il formato della data può essere scelto tra varie modalità, basta richiamare la funzione date() passando come parametro una stringa di specifica del formato:

Per ottenere la data nella formasi deve scrivere
01/01/08<?php
     print(date("d/m/y"));
?>
01/01/2008<?php
     print(date("d/m/Y"));
?>
1/1/2008<?php
     print(date("d-m-Y"));
?>

Notificare data e orario

Si supponga di voler notificare la data e l'ora in cui un utente si collega, mostrandogli, ad esempio un messaggio:

Mar 1 Gen 2008, accesso avvenuto alle 11:12:13,

le righe di codice sono:


Commenti allo script:

Nr rigaCommento
1Si crea l'array di stringhe $giorni e lo si inizializza con i valori corrispondenti ai nomi dei giorni, partendo dalla Domenica e non dal Lunedì.
2Si crea un array di stringhe inizializzato con i nomi dei mesi. I due array $giorni e $mesi rappresentano due tabelle per la traduzione dei corrispondenti valori numerici restituiti dalla funzione Date().
3La variabile $nrGiorno contiene un valore compreso tra 0 e 6, non avendo fornito il secondo parametro alla funzione date(), questo rappresenta il numero del giorno odierno della settimana
4Al numero del giorno si fa corrispondere il nome (Lun, Mar, ecc)
5Dalla data odierna viene estratto il giorno del mese, un valore compreso tra 1 e 31.
6Dalla data odierna si estrae il numero del mese, un valore compreso tra 1 e 12.
7Il numero del mese viene decrementato perchè, essendo usato come indice dell'array, deve variare tra 0 e 11.
8Si legge il nome del mese corrispondente al numero estratto dalla data odierna.
9Si estrae l'anno dalla data odierna.
10, 11, 12Dalla data odierna si prelevano l'ora, i minuti e i secondi.
13Si stampa la frase intercalando le variabili appena calcolate.

Parametri della funzione Date().

La funzione Date si aspetta un parametro di tipo stringa, obbligatorio, che rappresenta il formato in cui si vuole restituire la data.

Per una descrizione completa dela funzione date() si consulti la guida.

I parametri che si possono passare alla funzione date() sono:

a fa comparire am o pm accanto all'ora.
A fa comparire AM o PM accanto all'ora.
D indica le prime tre lettere del nome inglese del giorno della settimana. Per esempio Sun, Mon, Fri, Sat.
l indica il nome inglese del giorno della settimana. Per esempio Sunday, Monday, Friday, Saturday.
g indica l'ora, in formato 12 ore (da usare magari con i parametri a e A), senza l'eventuale zero iniziale.
G indica l'ora, in formato 24 ore, senza l'eventuale zero iniziale.
h indica l'ora, in formato 12 ore, con l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 01 e 12.
H indica l'ora, in formato 24 ore, con l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 01 e 24.
i indica i minuti, con l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 00 e 59.
I restituisce 1 se c'è l'ora legale, 0 se c'è quella solare.
j indica il giorno del mese, senza l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 1 e 31.
d indica il giorno del mese, con l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 01 e 31.
L restituisce 1 se l'anno è bisestile, 0 se non lo è.
m indica il numero del mese con l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 01 e 12.
n indica il numero del mese senza l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 1 e 12.
M indica le prime tre lettere del nome inglese del mese corrente. Per esempio Jan, Mar, Aug, Nov.
F indica il nome inglese per intero del mese corrente. Per esempio January, March, August, November.
O indica la differenza dal meridiano di Greenwich. Per esempio +0200 per indicare due ore di ritardo, o -0400 per indicare quattro ore di anticipo.
Z indica la differenza dal meridiano di Greenwich in secondi. Per esempio +43200 o - 43200.
r restituisce la data formattata secondo la norma RFC 822. Per esempio Thu, 21 Dec 2000 16:01:07 +0200. (Disponibile a partire da PHP 4.0.4)
s indica i secondi, con l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 00 e 59.
S indica il suffisso inglese per i numeri cardinali. Per esempio st, nd, rd, th.
t indica il numero di giorni di un dato mese senza lo zero iniziale. Quindi assumerà un valore compreso tra 1 e 31.
U indica il numero di secondi trascorsi dall'Unix Epoch, ovvero il 1 Gennaio 1970.
w indica il numero del giorno della settimana senza lo zero iniziale. Bisogna tenere conto che la settimana inglese inizia la Domenica, e che in PHP gli elementi si contano a partire da 0. Quindi assumerà 0 per Domenica, 1 per Lunedì e così via fino a 6 per Sabato.
W indica il numero della settimana corrente. Per questo parametro le settimane iniziano il Lunedì, e non la Domenica.
Y indica l'anno utilizzando quattro cifre. Per esempio 2003.
y indica l'anno utilizzando le ultime due cifre. Per esempio 03.
z indica il numero di giorno dell'anno senza l'eventuale zero iniziale. Quindi assumerà un valore compreso tra 1 e 366

La funzione mktime.

Per una descrizione completa della funzione mktime() si consulti la guida.

Sintassi:

int mktime ( int $ore , int $minuti , int $secondi , int $mese , int $giorno , int $anno [, int $is_dst ] )

Restituisce la Unix timestamp corrispondente a un intero lungo contenente il numero di secondi tra la Unix Epoch (01-01-1970) e la data e orario specificati. Gli argomenti possono essere omessi nell'ordine da destra a sinistra; in tal caso saranno impostati con il valore corrente di data e ora locale del server su cui si esegue lo script.

Il parametro is_dst può essere impostato su 1 se nell'orario è compresa l'ora legale, 0 altrimenti, o -1 (di default) se è sconosciuta la presenza dell'ora legale. Se è sconosciuta, l'interprete PHP proverà ad impostarlo da se.

Questo può causare un risultato inaspettato (ma non sbagliato).

mktime() è usata per fare calcoli tra date e convalidare una data. Per esempio, ognuna delle seguenti linee produce la stringa "Jan-01-1998".

Esempio di uso della funzione mktime()

Nelle righe seguenti la funzione mktime produce l'intero che è il secondo argomento per la funzione date. In tutte le date usate si assume che l'orario corrisponda alla mezzanotte.

<?php

  echo date("M-d-Y", mktime (0,0,0,12,32,1997)); (32° giorno di dicembre, cioè 1 gennaio)

  echo date("M-d-Y", mktime (0,0,0,13,1,1997)); (1° giorno del 13° mese, ancora 1 gennaio)

  echo date("M-d-Y", mktime (0,0,0,1,1,1998));

  echo date("M-d-Y", mktime (0,0,0,1,1,98));

?>

Year può avere sia 2 che 4 cifre, con valori compresi tra 0-69 e 2000-2069 oppure tra 70-99 e 1970-1999.

L'intervallo valido per il parametro year è tra 1902 e 2037).

L'ultimo giorno del mese dato può essere espresso come il giorno "0" del mese successivo, non come il giorno -1.

Entrambi i seguenti esempi produrranno la stringa "L'ultimo giorno di Feb 2000 è: 29".

<?php

  $finefeb = mktime(0,0,0,3,0,2000);

  echo "L'ultimo giorno di Feb 2000 &egrave;: ". date("j",$finefeb). "\n";

  $finefeb = mktime (0,0,0,4,-31,2000);

  echo "L'ultimo giorno di Feb 2000 &egrave;: ". date("j",$finefeb);

?>


Esercizi proposti:

Scrivere il programma php che consente di calcolare, rispetto alla data odierna:


Progetto di un calendario

Il calendario che si vuole ottenere avrà l'aspetto seguente:

January 2014
LunMarMerGioVenSabDom
   1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31   

I tag della pagina.

Nella sezione head è possibile inserire il riferimento ad un foglio di stile allo scopo di specificare le proprietà della tabella che rappresenterà il calendario.

<html>

<head>

<title>Calendario</title>

</head>

<body>

La sezione php

Si assume che si voglia leggere il calendario del mese corrente. Ipotizzando, invece, di consentire all'utente di scegliere il mese da rappresentare, allora la data dovrà essere acquisita come parametro.

<?php

// dalla data di oggi si separa ...

$giorno = date('d'); // ... il giorno,

$mese = date('m'); // ... il mese

$anno = date('Y'); // e l'anno.

Individuare il primo giorno del mese.

Il calendario verrà mostrato in una tabella avente i giorni della settimana nelle intestazioni di colonna, quindi si deve stabilire da quale colonna inizia la numerazione dei giorni.

// si imposta una variabile con la data del primo giorno del mese

$primoGiorno = mktime(0, 0, 0, $mese, 1, $anno);

// la funzione date(), con la stringa di formato 'F', restituisce il nome del mese in inglese

$nomeMese = date('F', $primoGiorno);

// dal giorno 1 del mese si legge il numero del giorno della settimana Dom=0 - Sab=6

$numGiorno = date('w', $primoGiorno);

// la tabella del calendario inizia dalla colonna del lunedì.

// Si deve calcolare in quale casella cade il giorno 1 del mese

$nrVuote = !$numGiorno ? 6 : $numGiorno-1;

la formula per il calcolo del numero di caselle vuote da inserire prima del giorno 1 del mese equivale alla seguente corrispondenza

switch($numGiorno) { 
  case 0: $nrVuote = 6; break; // domenica
  case 1: $nrVuote = 0; break; // lunedì
  case 2: $nrVuote = 1; break; // martedì
  case 3: $nrVuote = 2; break; // mercoledì
  case 4: $nrVuote = 3; break; // giovedì
  case 5: $nrVuote = 4; break; // venerdì
  case 6: $nrVuote = 5; break; // sabato
}

La funzione cal_days_in_month() restituisce il numero dei giorni del mese specificato come secondo parametro. Il primo parametro è il tipo di calendario (vedere manuale php).

$lunMese = cal_days_in_month(0, $mese, $anno);

Intestazione della tabella

La formattazione della tabella può essere specificata in un foglio di stile.

echo "<table border=1 width=294>";

echo "<tr><th colspan=7> $nomeMese $anno </th></tr>";

echo "<tr><td width=42>Lun</td><td width=42>Mar</td>";

echo "<td width=42>Mer</td><td width=42>Gio</td>";

echo "<td width=42>Ven</td><td width=42>Sab</td>";

echo "<td width=42>Dom</td></tr>";

Riempimento delle celle.

Dopo l'intestazione della tabella si inizia l'inserimento dei numeri nelle celle. Si richiede di lasciare un certo numero di celle vuote prima di inserire il numero 1 nella colonna del giorno corrispondente.

Inoltre è necessario contare le celle di volta in volta completate, perchè ogni 7 inizia una nuova settimana e si passa alla riga successiva

Si inseriscono le celle vuote che precedono il primo giorno del mese:

$contaGiorni = 1;

echo "<tr>";

while ( $nrVuote > 0 ) {

  echo "<td> </td>";

  $nrVuote--;

  $contaGiorni++;

}

Inserimento dei giorni settimana per settimana

Si usa un contatore per i giorni ed un contatore per le celle che, quando diventa 7, fa iniziare una nuova riga.

$nrGiorno = 1; // primo giorno del mese

while ( $nrGiorno <= $lunMese ) {

  echo "<td> $nrGiorno </td>";

  $nrGiorno++;

  // ogni 7 giorni inizia una nuova riga

  $contaGiorni = ($contaGiorni+1)%7;

  if ($contaGiorni==1) {

    echo "</tr><tr>";

  }

}

Completamento della tabella.

Quando sono stati inseriti tutti i giorni del mese, resta da completare l'ultima riga della tabella con celle vuote.

while ( $contaGiorni >1 && $contaGiorni <=7 ) {

  echo "<td> </td>";

  $contaGiorni++;

}

echo "</tr></table>";

?>

</body>

</html>

Esercizi.