Il timestamp in PHP

Gli argomenti di questa pagina

  • Timestamp
  • La funzione PHP time()
  • La funzione PHP mktime()
  • La funzione PHP strtotime()
  • Le tre funzioni a confronto

Timestamp

Il concetto che sta alla base della manipolazione delle date ed orari in PHP è il timestamp che rappresenta il numero di secondi trascorsi dal 1 gennaio 1970.
Il timestamp può essere utile nella programmazione per la manipolazione ed il monitoraggio delle date.
In PHP ci sono alcune funzioni che restituiscono il timestamp UNIX e sono descritte qui di seguito.

La funzione PHP time()

La sintassi:
time();

La funzione PHP time() restituisce l'attuale UNIX timestamp cioè l'ora corrente misurato in numero di secondi dalla Unix Epoch (1 Gennaio 1970 00:00:00).
Un semplicissimo esempio:

In questo esempio:
viene creato il timestamp della data corrente
viene visualizzata la data corrente col timestamp generato
viene creata la data della settimana prossima aggiungendo al timestamp 604.800 secondi (7 * 24 * 60 * 60).

1
2
3
4
5
6
7
<?php
$t_stamp 
time();
$nextWeek $t_stamp + (24 60 60);        //    604.800
echo $t_stamp ": Il timestamop corrente<br />\n";
echo 
date("d/m/Y",$t_stamp) . ": La data relativa al timestamop<br />\n";
echo 
date("d/m/Y",$nextWeek) . ": La data relativa alla settimana prossima<br />\n";
?>

1653822165: Il timestamop corrente
29/05/2022: La data relativa al timestamop
05/06/2022: La data relativa alla settimana prossima

La funzione PHP mktime()

La sintassi:
mktime(hour, minute, second, month, day, year);
Attenzione alla sequenza degli aromenti

La funzione PHP mktime() restituisce il timestamp UNIX di una certa data, ovvero il numero di secondi trascorsi dal 1 gennaio 1970 alls data in esame.
Nota: Per ottenere il timestamp occorre dare alla funzione le porzioni della data in questa sequenza: mm-gg-aaaa.
Per ottenere le porzioni di una data nella giusta maniera usiamo la funzione preg_split() con questo pattern: '/[-\.\/: ]/'. Questo pattern fa sì che la data sia divisa correttamente qualunque sia il carattere separatore tra le varie porzioni della data.

Come si vede dall'esempio, il timestamp per le date antecedenti il 1 gennaio 1970 sarà un numero negativo, ma questo non influisce negativamente sul risultato che si vuole raggiungere.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$data_1 
"18/07/2013";
$data_2 "12/01/1947";
list(
$giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data_1);
$t_stamp_1 "";
if (
checkdate($mese$giorno$anno)) {
    
$t_stamp_1 mktime(000$mese$giorno$anno);
    
$nuova_data_1 date("d/m/Y",$t_stamp_1);
}
//    ============================================================
list($giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data_2);
$t_stamp_2 "";
if (
checkdate($mese$giorno$anno)) {
    
$t_stamp_2 mktime(000$mese$giorno$anno);
    
$nuova_data_2 date("d/m/Y",$t_stamp_2);
}
//    ============================================================
echo "Il timestamp per " $data_1 ": " $t_stamp_1 "<br />\n";
echo (
$t_stamp_1 != "") ? $nuova_data_1 "Data errata";
echo 
"<hr />\n";
echo 
"Il timestamp per " $data_2 ": " $t_stamp_2 "<br />\n";
echo (
$t_stamp_2 != "") ? $nuova_data_2 "Data errata";
echo 
"<br />\n";
?>

Il timestamp per 18/07/2013: 1374098400
18/07/2013
Il timestamp per 12/01/1947: -724899600
12/01/1947

Vediamo un esempio pratico:
Nell'esempio qui sotto vado a calcolare 90 giorni da una certa data (tipico delle fatture).

Per la data 18/08/2013 i 90 giorni cadranno il 16/11/2013
per la data 01/01/1980 i 90 giorni cadranno il 31/03/1980
per la data 15/12/1990 i 90 giorni cadranno il 15/03/1991

1
2
3
4
5
6
7
8
9
<?php
$data 
"15/12/1990";
list(
$giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data);
$t_stamp mktime(000$mese$giorno 90$anno);
//    ============================================================
$nuova_data date("d/m/Y",$t_stamp);
echo 
$data ": data iniziale<br />\n";
echo 
$nuova_data ": data a 90 giorni<br />\n";
?>

15/12/1990: data iniziale
15/03/1991: data a 90 giorni

La funzione PHP strtotime()

La sintassi:
strtotime(time, [now]);

time: obbligatorio. Specifica una stringa di data/ora nella forma testuale
now: opzionale. Specifica il timestamp utilizzato come base per il calcolo delle date relative o, se non è specificato, la data ed ora corrente
La funzione strtotime() ritorna un timestamp in caso di successo o FALSE in caso di fallimento.

ATTENZIONE: Le date nel formato m/d/y o nel formato d-m-y sono considerate differenti; la differenza è data dal tipo di separatore usato tra i vari componenti:
se il separatore è una barra (/), è da assumere che la data è in stile americano m/d/y
se il separatore è un trattino (-) o un punto (.), è da assumere che la data è in stile europeo d-m-y

La funzione PHP strtotime() analizza le descrizioni testuali di datetime inglese in un timestamp Unix
La funzione aspetta di avere una stringa contenente un formato di data in Inglese e proverà a passare questo formato in un timestamp Unix (il numero di secondi dal 1 gennaio 1970 00:00:00 UTC), relativo al timestamp dato in now, o l'ora corrente.
Ogni parametro di questa funzione utilizza il fuso orario predefinito a meno che un fuso orario è specificato in quel parametro. Fare attenzione a non utilizzare fusi orari diversi in ogni parametro a meno che non sia deliberatamente voluto.

Qui sotto vediamo la data corrente scritta in vari formati.
Vediamo ora cosa è successo durante la ricerca del timestamp per ciascuna data scritta in notazione diversa sia per la sequenza degli elementi (gg mm aaaa oppure mm gg aaaa) sia per i separatori (/ -).
Intanto è da dire che tutte le date sono scritte in notazioni diverse, ma si riferiscono tutte al 17/08/2013.
Esempi 1 e 2: sequenza d m Y ma con separatori diversi: quella col separatore "/" è nulla
Esempi 3 e 4: sequenza m d Y ancora con diversi separatori: quella col separatore "-" è nulla
esempi 5 e 6: sequenza Y m d mostrano il corretto timestamp qualsiasi separatore usato

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
<?php
$data 
"17/08/2013";
list(
$giorno$mese$anno) = preg_split('/[-\.\/: ]/'$data);
$timestamp mktime(000$mese$giorno 90$anno);
//    ==========================================================
$cur_date1 date('d/m/Y'$timestamp);
$cur_date2 date('d-m-Y'$timestamp);
$cur_date3 date('m/d/Y'$timestamp);
$cur_date4 date('m-d-Y'$timestamp);
$cur_date5 date('Y/m/d'$timestamp);
$cur_date6 date('Y-m-d'$timestamp);
$t_stamp_1 strtotime($cur_date1);
$t_stamp_2 strtotime($cur_date2);
$t_stamp_3 strtotime($cur_date3);
$t_stamp_4 strtotime($cur_date4);
$t_stamp_5 strtotime($cur_date5);
$t_stamp_6 strtotime($cur_date6);
echo 
"Qui di seguito le date ed i relativi timestamp ottenuti con la funzione PHP strtotime()<br />\n";
echo 
"1) Per " $cur_date1 ": " $t_stamp_1 "<br />\n";
echo 
"2) Per " $cur_date2 ": " $t_stamp_2 "<br />\n";
echo 
"3) Per " $cur_date3 ": " $t_stamp_3 "<br />\n";
echo 
"4) Per " $cur_date4 ": " $t_stamp_4 "<br />\n";
echo 
"5) Per " $cur_date5 ": " $t_stamp_5 "<br />\n";
echo 
"6) Per " $cur_date6 ": " $t_stamp_6 "<br />\n";
?>

Qui di seguito le date ed i relativi timestamp ottenuti con la funzione PHP strtotime()
1) Per 15/11/2013:
2) Per 15-11-2013: 1384470000
3) Per 11/15/2013: 1384470000
4) Per 11-15-2013:
5) Per 2013/11/15: 1384470000
6) Per 2013-11-15: 1384470000

Le tre funzioni a confronto

Per facilitare il confronto fra le tre metodologie usate dalle tre funzioni, le ho riunite in un unico blocco di codice con tre sezioni:

  • nella prima sezione viene trattata la data corrente e vengono usate le tre funzioni
  • nella seconda sezione viene usata una qualsiasi data (nell'esempio uso ancora la data corrente, ma avrei potuto usare una data qualsiasi); in questo caso non ha senso usare la funzione time()
  • nella terza sezione viene usata una data nel formato che generalmente viene usato in un DB MYSQL

Per la funzione mktime() vengono usati gli argomenti nell'ordine: ora, minuto, secondo, mese, giorno, anno
per la funzione strtotime() è necessario cambiare la barra inclinata ( / ) col trattino per una data nel formato gg/mm/aaaa, ma non è necessario per una data nel formato aaaa/mm/gg.

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
<?php
$t_stamp 
time();
$m_stamp mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y"));
$s_stamp strtotime ("now");
//    ===================================================
$my_datetime date("d/m/Y H:i:s");
list(
$giorno$mese$anno$ora$minuto$secondo) = preg_split('/[-\.\/: ]/'$my_datetime);
$mk_stamp mktime($ora$minuto$secondo$mese$giorno$anno);
$data_modificata str_replace("/""-"$my_datetime);
$ss_stamp strtotime ($data_modificata);
//    ===================================================
$db_datetime date("Y/m/d H:i:s");
list(
$anno$mese$giorno$ora$minuto$secondo) = preg_split('/[-\.\/: ]/'$db_datetime);
$dbm_stamp mktime($ora$minuto$secondo$mese$giorno$anno);
$dbs_stamp strtotime ($db_datetime);
//    ===================================================
//    ===================================================
echo "Per la data corrente " date("d/m/Y H:i:s") . "<br />\n";
echo 
$t_stamp " con la funzione time()<br />\n";
echo 
$m_stamp " con la funzione mktime()<br />\n";
echo 
$s_stamp " con La funzione strtotime()<br />\n";
echo 
"<hr />\n";
echo 
"Per una data già formattata (in questo caso la stessa data corrente usata prima) " $my_datetime "<br />\n";
echo 
"la funzione time() si applica solo alla data corrente<br />\n";
echo 
$mk_stamp " con la funzione mktime()<br />\n";
echo 
$ss_stamp " con la funzione strtotime()<br />\n";
echo 
"<hr />\n";
echo 
"Per una data prelevata da un DB MYSQL " $db_datetime "<br />\n";
echo 
$dbm_stamp " con la funzione mktime()<br />\n";
echo 
$dbs_stamp " con la funzione strtotime()<br />\n";
?>

Per la data corrente 29/05/2022 13:02:45
1653822165 con la funzione time()
1653822165 con la funzione mktime()
1653822165 con La funzione strtotime()

Per una data già formattata (in questo caso la stessa data corrente usata prima) 29/05/2022 13:02:45
la funzione time() si applica solo alla data corrente
1653822165 con la funzione mktime()
1653822165 con la funzione strtotime()

Per una data prelevata da un DB MYSQL 2022/05/29 13:02:45
1653822165 con la funzione mktime()
1653822165 con la funzione strtotime()

Solo per curiosità viene usato uno qualsiasi dei timestamp estratti sopra per creare la data relativa e notiamo che la data è quella che ci aspettiamo.

1
2
3
4
<?php
$new_date 
date("d/m/Y H:i:s"$t_stamp);    //    uno qualsiasi dei timestamp trovati negli esempi precedenti
echo $new_date "<br />\n";
?>

29/05/2022 13:02:45

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum