HandlingDateAndTime

Da Php-faq.org.

Indice

[modifica] Come faccio della semplice aritmetica con date e tempo?

In questa pagina si presentano alcune tra le operazioni più frequenti effettuate sulle date e sul tempo, utilizzando le relative funzioni di PHP e l'aritmetica di base.

[modifica] Quali sono i numeri magici da conoscere quando lavoro con le date?

Alcuni dei numeri magici da conoscere sono le equivalenze tra secondi ed altre misure del tempo quali l'ora il giorno etc.

$second = 1;
$minute = 60;
$hour   = 3600;
$day    = 86400;
$week   = 604800;

Per le altre equivalenze le cose si complicano anche notevolmente a seconda dei calcoli necessari per arrivare alla soluzione, questo perché il numero di secondi in un mese cambia a seconda del mese interessato e nel caso di febbraio anche a seconda della bisestilità dell'anno.

$month[0]  = 0;

$month[1]  = 2678400; /* 31 days */
$month[2]  = 2419200; /* 28 days or for 29 days 2505600 seconds */
$month[3]  = 2678400; /* 31 days */

$month[4]  = 2592000; /* 30 days */
$month[5]  = 2678400; /* 31 days */
$month[6]  = 2592000; /* 30 days */

$month[7]  = 2678400; /* 31 days */
$month[8]  = 2678400; /* 31 days */
$month[9]  = 2592000; /* 30 days */

$month[10] = 2678400; /* 31 days */
$month[11] = 2592000; /* 30 days */
$month[12] = 2678400; /* 31 days */

[modifica] Come estraggo numero mese, giorno e anno da una data in un particolare formato?

Assumendo un formato del tipo `mm/gg/yyyy` e volendo mettere il mese, il giorno e l'anno rispettivamente in `$month`, `$day` e `$year`. Il codice si riduce ad una sola linea:

list($month, $day, $year) = explode('/', '07/14/2007');

Tuttavia sarebbe preferibile inserire qualche controllo sulla validità della stringa da esaminare e sulla bontà dei valori inseriti.

[modifica] Come calcolo la differenza in giorni tra due date?

Partendo con i valori di mese, giorno ed anno di due date la procedura da seguire è semplice:

  • si usa mktime per ottenere lo unix timestamp di entrambe le date
  • si effettua la differenza
  • si divide per 86400 (numero di secondi in un giorno)
  • (opzionale) si normalizza il risultato in caso di valore non intero

Quindi il codice diventa qualcosa del genere:

$date0 = mktime(0, 0, 0, $month0, $day0, $year0);
$date1 = mktime(0, 0, 0, $month1, $day1, $year1);
$diff  = (max($date0, $date1) - min($date0, $date1)) / 86400;

Due piccole note:

  • l'uso di min e max permette di non preoccuparsi di scoprire chi è il minuendo ed il sottraendo.
  • nonostante il fatto che il risultato in `$diff` sembri non poter essere altro che un intero, in alcuni casi si possono notare valori non interi, causati da convenzioni come l'ora legale o da altre circostanze.
Strumenti personali