Formattare e gestire le date con database mysql + php

Questo post è servito più che altro a me come appunto di programmazione.
Infatti ogni volta che devo lavorare con le date in php + mysql mi dimentico come fare…
Ogni developer che crea siti dinamici infatti deve prima o poi fare i conti con le date e con la loro gestione.
In Mysql nei campi che sono DATETIME vengono salvate date in formato americano del tipo YYYY-mm-dd hh:mm:ss es 2012-05-31 21:14:36
Mentre quasi sempre noi europei necessitiamo del formato standar dd/mm/YYYY (es. 31/05/2012)
Ecco quindi che quando andiamo a salvare una data in mysql dobbiamo standarizzarla nel formato standard.
Ovviamente possiamo salvare sia una data sola e sia una data completa con orario.
Vediamo prima come formattare la data e salvarla nel db mysql.
Per farlo il metodo più semplice è di utilizzare direttamente la funzione di mysql date_format
Quindi ipotizzando che essa è contenuta nella nostra variabile $data_input
$data_input = "31/05/2012";
$query = "INSERT INTO table VALUES('" . STR_TO_DATE($data_input, '%d/%m/%Y' )."')";
Abbiamo inserito nella tabella di esempio table il valore 2012-05-31 00:00:00.
Quindi per usare STR_TO_DATE si specifica la data con la nostra formattazione europea (o una variabile come nell’esempio) seguita dallo schema della sua struttura. Nel nostro esempio %d/%m/%Y.
Se volevamo inserire anche l’ora bastava solamente specificare anche H:i:s.
Ora vediamo come importare dal db mysql la data con formattazione standard e convertirla in quella che preferiamo.
Utilizzeremo anche in questo caso una funzione di mysql date_format.
Vediamo un esempio nello specifico:
$query = "SELECT DATE_FORMAT(campo_data, '%d/%m/%Y')as data_formattata FROM table WHERE id = '$id'"; $result = mysql_query($query); $row = mysql_fetch_array($result); echo $row['data_formattata']; \\ stampa "31/05/2012"
In alternativa possiamo utilizzare anche la funzione di php per la formattazione delle date date_format (manuale ufficiale)
Es.
$data = "2012-05-31 15:36:21"; $data = date_create($data); // creo l'oggeto data echo date_format($date, 'H:i:s d/m/Y'); // stampa 15:36:21 31/05/2012
Queste due non sono le uniche due possibili soluzioni. Infatti si può anche modificare le date con php utilizzando la funzione explode.
Supponiamo di prelevare il dato dal db e di metterlo in una variabile temporanea.
// $data prelevato da db
// $data = "2012-05-31 15:36:21";
$temp1 = explode(" ", $data);
$temp2 = explode("-", $temp1[0]);
$data_formattata = $temp2[2]."/".$temp2[1]."/".$temp2[0];
echo $data_formattata; // stampa 31/05/2012
In pratica basta prendere il dato, dividerlo in più pezzi in base alla composizione standard dei valori DATETIME e poi “riassemblarlo”.
Questa soluzione è più complessa, ci servono più righe di codice per cui le due soluzioni mostrate prima (che utilizzano le due funzioni di mysql o php) sono da preferire.
Appunto salvato! Per la prossima volta che mi (ci) capiterà di lavorare con le date e mysql+php!










5 Commenti
Credo sia meglio fare qualche precisazione, specialmente in un post che si propone di spiegare i formati di data ai profani.
Nell’articolo si parla erroneamente di “formato americano” per indicare yyy-mm-dd. In realtà il formato americano – o meglio il formato anglosassone, tipico dei paesi anglofoni come Germania, Regno Unito e USA – è quello che, per la gioia di noi italiani, inverte giorno e mese: mm-dd-yyyy.
Il formato yyyy-mm-dd è sì quello usato da MySQL, ma è prima di tutto lo standard ISO 8601, universalmente utilizzato in informatica e non solo, perchè privo di ambiguità rispetto ai vari formati di data localizzati.
L’articolo si propone di spiegare come lavorare con le date e mysql+php
Poi come si chiamino i vari formati poco importa
Comunque grazie della precisazione, effettivamente il formato YYYY-mm-dd è il formato standard Informatico (non americano)
Qualche tempo fa ho postato sul mio blog una funzione che si propone come possibile soluzione del problema da utilizzare in entrambi i versi (db to str o str to db): http://www.orangedropdesign.com/web/veloce-funzione-php-per-la-conversione-dei-formati-data/
Grazie, veramente molto semplice e utile. Ho appena usato il tuo “appunto” per fare uno script che aggiunge un’ora ad una data memorizzata in una tabella di un database di joomla:
$db = JFactory::getDBO();
$db->setQuery(“SELECT `date_field` FROM `date table` where `id` = {rrid}”);
$data = $db->loadResult();
$temp1 = explode(” “, $data);
$temp2 = explode(“:”, $temp1[1]);
$temp2[0] = $temp2[0]+1;
$unOraInPiu= $temp1[0].” “.$temp2[0].”:”.$temp2[1].”:”.$temp2[2];
return $unOraInPiu;
Ottimo! Ovviamente possiamo personalizzarlo e usarlo su qualsiasi db nostro…