Eu acho que manter seus valores de data e hora no campo do tipo
DATETIME
seria meio natural. De minha própria experiência com meu aplicativo PHP atual, apenas
read
/ write
operações relativas a esta informação podem ser problemáticas. Uma das soluções possíveis (assumindo que você use
DATETIME
tipo de dados) para executar corretamente todo o processo pode ser a seguinte abordagem:Ler valores DATETIME para uso do PHP
- Adquirir
DATETIME
campos do seu banco de dados convertendo-os na consulta para representação de string na forma de'2011-10-02T23:25:42Z'
usandoDATE_FORMAT
Função MySQL com'%Y-%m-%dT%H:%i:%sZ'
string de formatação (documentos em DATE_FORMAT ) - Leia o valor da coluna buscada neste formato específico e converta-o em PHP de string para representação de data e hora real válida para PHP (como
DateTime
objetos de classe eDateTime::createFromFormat
método estático fornecido'Y-m-d\TH:i:s\Z'
string de formatação (T
eZ
são escapados para evitar tratá-los como diretivas de formatação) (docs for the method ). - Use valores convertidos como valores de data e hora reais com toda a lógica aplicável, como comparações de data real (não comparações de texto), etc.
Escrevendo data e hora do PHP no banco de dados MySQL
- Converter, ou seja, PHP
DateTime
objeto de classe para nosso ISO 8601 em representação de string de formato UTC usandoDateTime
format
do objeto de classe método com o mesmo de antes de'Y-m-d\TH:i:s\Z'
string de formatação (documentação ). - Executar
INSERT
/UPDATE
operação nas informações do banco de dados usando tal string preparada como parâmetro para a função MySQLSTR_TO_DATE
(com'%Y-%m-%dT%H:%i:%sZ'
string de formatação) que o converte em banco de dados realDATETIME
valor (documentos em STR_TO_DATE ).
Exemplo de código em PHP
Abaixo, encontre um rascunho de exemplo de tal abordagem usando objetos 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
}
Essa abordagem me ajudou muito na operação de valores de data e hora entre PHP e banco de dados MySQL.
Espero que possa ser útil para você também.