Penso che mantenere i valori di data e ora nel campo di tipo DATETIME
sarebbe un modo naturale.
Dalla mia esperienza con la mia attuale applicazione PHP, solo read
/ write
le operazioni relative a queste informazioni potrebbero essere problematiche.
Una delle possibili soluzioni (supponendo che utilizzi DATETIME
tipo di dati) per eseguire correttamente l'intero processo potrebbe essere il seguente approccio:
Lettura dei valori DATETIME per uso PHP
- Acquisisci
DATETIME
campi dal tuo database convertendoli nella query alla rappresentazione di stringhe sotto forma di'2011-10-02T23:25:42Z'
utilizzandoDATE_FORMAT
Funzione MySQL con'%Y-%m-%dT%H:%i:%sZ'
stringa di formattazione (documenti su DATE_FORMAT ) - Leggi il valore della colonna recuperata in questo formato specifico e convertilo in PHP da stringa in una rappresentazione di data e ora reale valida per PHP (come
DateTime
oggetti classe eDateTime::createFromFormat
metodo statico dato'Y-m-d\TH:i:s\Z'
stringa di formattazione (T
eZ
vengono salvati per evitare di trattarli come direttive di formattazione) (documenti per il metodo ). - Utilizza i valori convertiti come valori di data e ora reali con tutta la logica applicabile, come i confronti di date reali (non i confronti di testo), ecc.
Scrittura di data e ora PHP nel database MySQL
- Converti cioè PHP
DateTime
oggetto di classe alla nostra rappresentazione di stringa in formato UTC ISO 8601 utilizzandoDateTime
format
dell'oggetto classe metodo con lo stesso di prima'Y-m-d\TH:i:s\Z'
stringa di formattazione (documentazione ). - Esegui
INSERT
/UPDATE
operazione sulle informazioni del database utilizzando tale stringa preparata come parametro per la funzione MySQLSTR_TO_DATE
(con'%Y-%m-%dT%H:%i:%sZ'
formatting string) che lo converte nel database realeDATETIME
valore (documenti su STR_TO_DATE ).
Esempio di codice in PHP
Di seguito è riportato un esempio di bozza di tale approccio utilizzando oggetti PDO:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
Questo approccio mi ha aiutato molto a gestire i valori di data e ora tra PHP e database MySQL.
Spero che possa essere utile anche per te.