Formato PHP date () ao inserir data e hora no MySQL

324

Qual é o formato correto para passar para a date()função em PHP se eu quiser inserir o resultado em uma datetimecoluna 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.

Alex
fonte
3
Como você não está fornecendo um parâmetro até o momento, deseja registrar a hora atual?
Mark Elliot

Respostas:

680

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 Gpara H, embora possa não ter impacto, você provavelmente deseja usar o formato de 24 horas com os 0s à esquerda.

Mark Elliot
fonte
28
esse deve ser um dos formatos de data e hora mais comuns que alguém precisaria. deve ser construído em php global ou parte da própria função de data (por exemplo, 'c', 'r')
billynoah
33
Por que não é esse o caso, eu não sei. Eu tenho que me referir ao estouro de pilha a cada. solteiro. funcionando. Tempo.
Mazatec
11
É mais rápido vir aqui do que procurar no meu código um uso como este.
MRodrigues
64
Só pensava em um mnemônico bonito para lembrar o formato: " Y nossa m y d comeu não Seu ". funciona em tantos níveis :)
IzzEps
2
Deve haver uma forma abreviada php para este como existe para ISO 8601 e RFC 2822
billynoah
105

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.

Tim Lytle
fonte
1
Obrigado @Pekka - Lembro-me de quando você e eu tínhamos o mesmo representante - você tem sido bastante ativo.
Tim Lytle
1
Sim, estou trabalhando muito agora, e SO é o meu passatempo favorito no meio :) que mudará novamente.
Pekka
41

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_UNIXTIMEfunçã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 |
+---------------------+
JAL
fonte
Este é um elegante solution.Thanks :)
kta
2
@trejder, quem lhe disse que fazê-lo no mysql é mais rápido do que fazê-lo no php? Fazê-lo em PHP é melhor porque o banco de dados geralmente é o gargalo e você deseja entrar e sair o mais rápido possível .
Pacerier 15/01
1
@Pacerier, o banco de dados é o gargalo se você tiver um banco de dados mal construído ou estiver executando muitas consultas pequenas em vez de uma consulta única efetiva mais robusta ou, em muitos casos, se você contar com um ORM para gerenciar o banco de dados. SQL sólido com um banco de dados relacional bem indexado não é lento.
Mopsyd #
2
@mopsyd, o banco de dados é o gargalo, porque escalá- lo horizontalmente requer complexidade. Compare isso com servidores da Web que podem ser duplicados em todo o mundo sem nenhuma alteração no código.
Pacerier
1
Se a consulta falhar, estiver registrada em algum lugar e você precisar depurá-la, o carimbo de data e hora será muito mais difícil de ler do que a string de data formatada descrita por @ tim-lytle.
humbads
27

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.

Steffan Clent Davies
fonte
12
$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`
Ali Umair
fonte
2
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como responde à pergunta melhoraria significativamente seu valor a longo prazo. Por favor edite sua resposta para adicionar alguma explicação, e para corrigir os seus problemas de formatação.
Toby Speight
9

Formate o carimbo de data e hora na coluna MySQL DATETIME:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Ahmed Saber
fonte
8

Formate o datetime do MySQL com PHP

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
dev4092
fonte
8

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;
}
SandroMarques
fonte
Votei sua resposta porque ela funcionou depois que editei a primeira linha; 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.
31717 Chris Chris
"Argumento 1 passou para getDateForDatabase () deve ser uma instância de string, string dada", - a minha entrada era uma corda,
Chris Rosa
7

Não é necessário usar o método date () do PHP se você não usar um carimbo de data / hora. Se datepostedfor uma coluna de data e hora, você pode inserir a data atual como esta:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
Adão
fonte
2
Obrigado por compartilhar essa abordagem. É o método mais fácil que eu já vi até agora.
Shondeslitch 11/03/19
2

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));
    }
}
Brian Jones
fonte
1

Usando DateTimeclasse 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");
}
Nino Škopac
fonte
1

Um pequeno adendo à resposta aceita: Se o banco de dados datetimeestiver 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.

Bruno
fonte
0

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

Maurici Abad
fonte