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.
