Qual é o formato correto para passar para a date()
função em PHP se eu quiser inserir o resultado em uma datetime
coluna do tipo MySQL ?
Eu tenho tentado, date("Y-M-D G:i:s")
mas isso apenas insere "0000-00-00 00:00:00" toda vez.
Qual é o formato correto para passar para a date()
função em PHP se eu quiser inserir o resultado em uma datetime
coluna do tipo MySQL ?
Eu tenho tentado, date("Y-M-D G:i:s")
mas isso apenas insere "0000-00-00 00:00:00" toda vez.
Respostas:
O problema é que você está usando 'M'
e 'D'
, que são representações textuais, o MySQL espera uma representação numérica do formato2010-02-06 19:30:13
Tente: date("Y-m-d H:i:s")
que usa os equivalentes numéricos.
editar: alternado G
para H
, embora possa não ter impacto, você provavelmente deseja usar o formato de 24 horas com os 0s à esquerda.
Nos comentários da date()
página de manual do php :
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
Você tinha o 'Y' correto - esse é um ano inteiro, mas 'M' é um mês de três caracteres, enquanto 'm' é um mês de dois dígitos. Mesmo problema com 'D' em vez de 'd'. 'G' é uma hora de 1 ou 2 dígitos, onde 'H' sempre tem um 0 à esquerda quando necessário.
Aqui está uma solução alternativa: se você tem a data no PHP como um carimbo de data / hora, ignore a manipulação com o PHP e deixe o DB cuidar de transformá-lo usando a FROM_UNIXTIME
função
mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)
mysql> select * from a_table;
+---------------------+
| a_date |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+
Eu uso o seguinte código PHP para criar uma variável que insiro em uma coluna MySQL DATETIME.
$datetime = date_create()->format('Y-m-d H:i:s');
Isso manterá a Data e Hora atuais do servidor.
$date_old = '23-5-2016 23:15:23';
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));
//Format should be like 'Y-m-d H:i:s'`enter code here`
Formate o carimbo de data e hora na coluna MySQL DATETIME:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Eu uso esta função (PHP 7)
function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Versões anteriores do PHP (PHP <7)
function getDateForDatabase($date) {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
function getDateForDatabase(string $date) : string {
to function getDateForDatabase($date) {
Por que as declarações de tipo geram um erro, não sei PHP suficiente para dizer.
Não é necessário usar o método date () do PHP se você não usar um carimbo de data / hora. Se dateposted
for uma coluna de data e hora, você pode inserir a data atual como esta:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
Isso está me deixando louco, procurando uma resposta simples. Finalmente, criei essa função que parece capturar todas as entradas e fornecer uma boa string SQL correta ou, pelo menos, válida e verificável. Se for 1999-12-31, provavelmente está errado, mas não causará um erro grave no MySQL.
function MakeSQLDate($date) {
if (is_null($date)) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
}
if (($t = strtotime($date)) === false) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
} else {
return date('Y-m-d H:i:s', strtotime($date));
}
}
Usando DateTime
classe no PHP7 +:
function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('UTC'));
$dt->setDate($year, $month, $day);
$dt->setTime(0, 0, 0, 0); // set tine to midnight
return $dt->format("Y-m-d H:i:s");
}
Um pequeno adendo à resposta aceita: Se o banco de dados datetime
estiver armazenado como UTC (o que eu sempre faço), você deve usar em gmdate("Y-m-d H:i:s")
vez de date("Y-m-d H:i:s")
.
Ou, se você preferir deixar o MySQL lidar com tudo, como sugerem algumas respostas, eu insiro o MySQL UTC_TIMESTAMP
, com o mesmo resultado.
Nota: eu entendi a pergunta referente à hora atual.
Essa é uma maneira mais precisa de fazer isso. Coloca decimais atrás dos segundos, dando mais precisão.
$now = date('Y-m-d\TH:i:s.uP', time());
Observe o .uP
.
Mais informações: https://stackoverflow.com/a/6153162/8662476