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
<?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.
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
@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.
$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`
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:
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())");
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.
functionMakeSQLDate($date){if(is_null($date)){//use 1999-12-31 as a valid date or as an alertreturn date('Y-m-d', strtotime('1999-12-31'));}if(($t = strtotime($date))===false){//use 1999-12-31 as a valid date or as an alertreturn date('Y-m-d', strtotime('1999-12-31'));}else{return date('Y-m-d H:i:s', strtotime($date));}}
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.
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
paraH
, embora possa não ter impacto, você provavelmente deseja usar o formato de 24 horas com os 0s à esquerda.fonte
Nos comentários da
date()
página de manual do php :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.
fonte
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çãofonte
Eu uso o seguinte código PHP para criar uma variável que insiro em uma coluna MySQL DATETIME.
Isso manterá a Data e Hora atuais do servidor.
fonte
fonte
Formate o carimbo de data e hora na coluna MySQL DATETIME:
fonte
Formate o datetime do MySQL com PHP
fonte
Eu uso esta função (PHP 7)
Versões anteriores do PHP (PHP <7)
fonte
function getDateForDatabase(string $date) : string {
tofunction 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:fonte
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.
fonte
Usando
DateTime
classe no PHP7 +:fonte
Um pequeno adendo à resposta aceita: Se o banco de dados
datetime
estiver armazenado como UTC (o que eu sempre faço), você deve usar emgmdate("Y-m-d H:i:s")
vez dedate("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.
fonte
Essa é uma maneira mais precisa de fazer isso. Coloca decimais atrás dos segundos, dando mais precisão.
Observe o
.uP
.Mais informações: https://stackoverflow.com/a/6153162/8662476
fonte