O que precisamos saber é como a data é armazenada no SQL. É Timestamp ou Datetime ou unixtime?
Ólafur Waage
Eles não são armazenados no horário unix, como em uma data normal, é o PHP que lida com ele como segundos e outras coisas. Eu recomendo que você use as OOPfunções de data e hora do PHP , elas são muito fáceis de usar.
precisa saber é o seguinte
2
Posso recomendar uma alternativa ao seu formato de data? mm/dd/yyé muito americano, e aqueles que vivem em outras partes do mundo ficam um pouco irritados ao tentar adivinhar o que se entende por isso 11-12-13. O padrão mais universal é yyyy-mm-dde faz parte do padrão ISO 8601. Caso contrário, você deve usar o nome do mês , não o número.
Manngo
Respostas:
515
Se você está procurando uma maneira de normalizar uma data no formato MySQL, use o seguinte
A linha $phpdate = strtotime( $mysqldate )aceita uma sequência e executa uma série de heurísticas para transformá-la em um registro de data e hora unix.
A linha $mysqldate = date( 'Y-m-d H:i:s', $phpdate )usa esse registro de data e hora e a datefunção do PHP para transformá-lo novamente no formato de data padrão do MySQL.
( Nota do editor : esta resposta está aqui devido a uma pergunta original com texto confuso, e a utilidade geral do Google que essa resposta forneceu, mesmo que ela não respondesse diretamente à pergunta que existe agora)
@ 0xBAADF00D: leia a pergunta novamente ... ninguém perguntou sobre o formato padrão do MySQL.
user7116
3
é claro, mas, quando existem padrão, poderia ser bom para seguir padrão (é evitar dores de cabeça mais tarde, quando um outro trabalho dev em seu código) xD
0xBAADF00D
4
A pergunta solicita a saída no formato mm / dd / aa H: M (AM / PM), não "Ymd H: i: s".
Rikki
6
does not workpara quem? A resposta aceita funcionará se você desejar converter do MySQL em mm / dd / aa H: M (AM / PM) conforme o OP solicitado. Só porque você quer fazer o oposto não faz com que a resposta aceita seja errada.
toxalot
311
Para converter uma data recuperada do MySQL no formato solicitado ( mm/dd/yy H:M (AM/PM)):
Eu posso estar errado, mas acho que alguns de vocês estão perdendo o ponto. Ele deseja que a saída esteja no formato "m / d / yg: i A", puxando a data original de um campo DATETIME. Então o código dele funciona. @Mike $ row-> createdate é apenas a coluna de data e hora de Tim.
Mere Development
4
A resposta do @AsTeR só é confusa se você interpretou mal a pergunta. O OP respondeu à própria pergunta e quer tirar uma data do MySQL e enviar para o formato solicitado: mm / dd / aa H: M (AM / PM) .
toxalot
@TimBoland eu pensar resposta poderia ser melhorada se a partir foi enfatizado, bem como o formato requerido mm / dd / yy H: H (AM / PM) . E poderia se beneficiar de um link para a função de data. Tentei sugerir uma edição , mas ela foi rejeitada.
toxalot
1
Curiosidade: essa resposta é aproximadamente equivalente à logo abaixo (que praticamente não tem votos negativos), mas obteve> 40 votos negativos porque responde à pergunta do OP, que difere daquela que as pessoas que acessam esta página realmente têm.
Clément
110
Se você estiver usando o PHP 5, também poderá tentar
Acho que as pessoas votam negativamente porque estão confusas sobre a questão do OP. A maioria lê a pergunta como o oposto do que realmente é. A outra possibilidade é que isso é muito semelhante à resposta aceita publicada há mais de 5 anos.
toxalot
1
O link que você faz referência não aponta para a função que você está usando, nem explica o formato. Eu acho que php.net/function.date.php seria melhor.
toxalot
@toxalot A resposta aceita está errada. Editado após a minha resposta e sobre o meu link, substituo o seu link. Obrigado
Tony Stark
1
Toda essa sessão de perguntas e respostas tem uma história sórdida. A resposta aceita estava errada entre 29 de abril de 2013 e 24 de maio de 2013. Estava correta quando você postou sua resposta. Sua resposta estava errada até 29 de maio de 2013, após o que se tornou muito semelhante à resposta aceita.
precisa saber é o seguinte
23
Finalmente, a solução certa para o PHP 5.3 e superior:
(fuso horário opcional adicionado ao exemplo, como mencionado nos comentários)
seu erro .. Classe 'App \ Controller \ DateTime' não encontrada .. usando php 6.4
aswzen 26/11
1
Se você estiver trabalhando em outro espaço para nome, precisará chamá-lo com uma barra invertida na frente:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester 4/17/17
2
Não se esqueça de especificar o fuso horário ao criar seu objeto de data! Caso contrário, sua data formatada poderá demorar várias horas. Suas datetimecolunas devem ser UTF8, portanto, passe new DateTimeZone('UTC')como o terceiro parâmetro para garantir que o PHP saiba.
Eric Seastrand
Esta é a resposta correta que gera formato desejado do OP, apenas cuidar de fusos horários
Se você preferir fazê-lo em PHP, precisará da função de data , mas precisará primeiro converter o valor do banco de dados em um registro de data e hora.
-1 porque a data de formatação no DB não é uma boa ideia. A Web multilíngue precisa de diferentes formatos de data e, em seguida, você precisa formatar a data em PHP (linguagem de lógica de negócios em comum). Quando você escreveu sobre a datefunção, também deve escrever sobre a strottimefunção para ajudar alguém em vez de "mas terá que converter o valor do banco de dados em um registro de data e hora primeiro".
O MySQL na verdade não usa esse formato e o MySQL gera um aviso se você incluir o designador de fuso horário "+ xxxx" gerado por ele. UPDATE X SET Y = '2014-03-31T15: 00: 00 + 0100' em que Z; Consulta OK, 0 linhas afetadas, 1 aviso (0,06 s) Linhas correspondidas: 1 Alterado: 0 Avisos: 1
George Lund
O OP quer tirar uma data do formato MySQL e converter em mm / dd / aa H: M (AM / PM) .
toxalot
8
Isso deve formatar um campo em uma consulta SQL:
SELECT DATE_FORMAT(`fieldname`,'%d-%m-%Y') FROM tablename
Você deve especificar a consulta do MySQL , não apenas o SQL, porque isso não funcionará necessariamente com todos os bancos de dados. Enquanto o OP solicitou a solução PHP, esta é uma boa alternativa que o OP pode não conhecer. No entanto, isso não fornecerá o formato solicitado. Para obter o formato OP solicitado, você precisaria '%m/%d/%y %h:%i %p'.
Isso não responde à pergunta do OP. O OP quer tirar uma data do formato MySQL e converter em mm / dd / aa H: M (AM / PM) . Além disso, isso apenas formatará a hora atual, não uma data específica.
toxalot
5
SELECT
DATE_FORMAT(demo.dateFrom,'%e.%M.%Y')as dateFrom,
DATE_FORMAT(demo.dateUntil,'%e.%M.%Y')as dateUntil
FROM demo
Se você não deseja alterar todas as funções do seu código PHP, para mostrar o formato de data esperado, altere-o na fonte - seu banco de dados.
É importante citar as linhas com o quanto operador como no exemplo acima (como dateFrom, como dateUntil). Os nomes que você escreve são os nomes, as linhas serão chamadas no seu resultado.
A saída deste exemplo será
[Dia do mês, numérico (0..31)]. [Nome do mês (janeiro a dezembro)]. [Ano, numérico, quatro dígitos]
Exemplo: 5.Agosto.2015
Altere os pontos com o separador de escolha e verifique a função DATE_FORMAT (data, formato) para obter mais formatos de data.
Você também pode fazer com que sua consulta retorne a hora como um carimbo de data / hora do Unix. Isso eliminaria a necessidade de chamar strtotime()e tornar as coisas um pouco menos intensivas no lado do PHP ...
select UNIX_TIMESTAMP(timsstamp)as unixtime from the_table where id =1234;
Então, no PHP, use a date()função para formatá-la da maneira que você desejar.
<?php
echo date('l jS \of F Y h:i:s A', $row->unixtime);?>
ou
<?php
echo date('F j, Y, g:i a', $row->unixtime);?>
Eu gosto dessa abordagem em vez de usar o MySQL 'sDATE_FORMAT função do , porque ela permite reutilizar a mesma consulta para pegar os dados e alterar a formatação no PHP.
É irritante ter duas consultas diferentes apenas para alterar a aparência da data na interface do usuário.
Eu gosto da idéia de usar UNIX_TIMESTAMPpara eliminar a necessidade strtotime. Essa resposta seria melhor se desse um exemplo de formatação da hora no formato que o OP realmente solicitou.
toxalot
1
Você pode ter problemas com datas não retornadas no carimbo de data e hora do Unix, portanto isso funciona para mim ...
return date("F j, Y g:i a", strtotime(substr($datestring,0,15)))
Isso não converte a data no formato solicitado pelo OP
toxalot 13/03/14
0
A abordagem que sugiro funciona da seguinte maneira. Primeiro, você cria um objeto datetime básico a partir de uma string no formato mysql; e então você formata do jeito que você gosta. Felizmente, o mysql datetime é compatível com ISO8601, portanto, o próprio código pode parecer bastante simples e elegante. Lembre-se de que a datetimecoluna não possui informações de fuso horário; portanto, você precisa convertê-las adequadamente .
Aqui está o código:
(new ISO8601Formatted(newFromISO8601('2038-01-19 11:14:07'),'m/d/Y h:iA'))->value();
Produz 01/19/2038 11:14AM - esperançosamente o que você espera.
Isso não responde à pergunta do OP. O OP quer tirar uma data do formato MySQL e converter em mm / dd / aa H: M (AM / PM) . Isso faz o contrário. Além disso, recebe a entrada de um formulário e não do banco de dados.
OOP
funções de data e hora do PHP , elas são muito fáceis de usar.mm/dd/yy
é muito americano, e aqueles que vivem em outras partes do mundo ficam um pouco irritados ao tentar adivinhar o que se entende por isso11-12-13
. O padrão mais universal éyyyy-mm-dd
e faz parte do padrão ISO 8601. Caso contrário, você deve usar o nome do mês , não o número.Respostas:
Se você está procurando uma maneira de normalizar uma data no formato MySQL, use o seguinte
A linha
$phpdate = strtotime( $mysqldate )
aceita uma sequência e executa uma série de heurísticas para transformá-la em um registro de data e hora unix.A linha
$mysqldate = date( 'Y-m-d H:i:s', $phpdate )
usa esse registro de data e hora e adate
função do PHP para transformá-lo novamente no formato de data padrão do MySQL.( Nota do editor : esta resposta está aqui devido a uma pergunta original com texto confuso, e a utilidade geral do Google que essa resposta forneceu, mesmo que ela não respondesse diretamente à pergunta que existe agora)
fonte
does not work
para quem? A resposta aceita funcionará se você desejar converter do MySQL em mm / dd / aa H: M (AM / PM) conforme o OP solicitado. Só porque você quer fazer o oposto não faz com que a resposta aceita seja errada.Para converter uma data recuperada do MySQL no formato solicitado (
mm/dd/yy H:M (AM/PM)
):Consulte as opções de formatação de data do PHP para ajustar o formato.
fonte
$row
objeto?Se você estiver usando o PHP 5, também poderá tentar
fonte
("Y-m-d H:i:s")
Referência: http://php.net/manual/en/function.date.php
fonte
Finalmente, a solução certa para o PHP 5.3 e superior: (fuso horário opcional adicionado ao exemplo, como mencionado nos comentários)
fonte
\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
datetime
colunas devem ser UTF8, portanto, passenew DateTimeZone('UTC')
como o terceiro parâmetro para garantir que o PHP saiba.Uma maneira mais fácil seria formatar a data diretamente na consulta MySQL, em vez de PHP. Veja a entrada manual do MySQL para DATE_FORMAT .
Se você preferir fazê-lo em PHP, precisará da função de data , mas precisará primeiro converter o valor do banco de dados em um registro de data e hora.
fonte
date
função, também deve escrever sobre astrottime
função para ajudar alguém em vez de "mas terá que converter o valor do banco de dados em um registro de data e hora primeiro".Esqueça tudo. Apenas use:
fonte
Para formatar corretamente um
DateTime
objeto em PHP para armazenamento no MySQL, use o formato padronizado que o MySQL usa, que é ISO 8601 .O PHP mantém esse formato armazenado como constante desde a versão 5.1.1, e eu recomendo usá-lo em vez de digitar manualmente a string toda vez.
Isso e uma lista de outras constantes PHP DateTime estão disponíveis em http://php.net/manual/en/class.datetime.php#datetime.constants.types
fonte
Isso deve formatar um campo em uma consulta SQL:
fonte
'%m/%d/%y %h:%i %p'
.Use a função de data :
fonte
Dependendo da sua configuração de data e hora do MySQL. Normalmente: 2011-12-31 07:55:13 formato. Esta função muito simples deve fazer a mágica:
Ou um pouco mais adiantado para combinar com a pergunta.
fonte
Se você não deseja alterar todas as funções do seu código PHP, para mostrar o formato de data esperado, altere-o na fonte - seu banco de dados.
É importante citar as linhas com o quanto operador como no exemplo acima (como dateFrom, como dateUntil). Os nomes que você escreve são os nomes, as linhas serão chamadas no seu resultado.
A saída deste exemplo será
[Dia do mês, numérico (0..31)]. [Nome do mês (janeiro a dezembro)]. [Ano, numérico, quatro dígitos]
Exemplo: 5.Agosto.2015
Altere os pontos com o separador de escolha e verifique a função DATE_FORMAT (data, formato) para obter mais formatos de data.
fonte
Você também pode fazer com que sua consulta retorne a hora como um carimbo de data / hora do Unix. Isso eliminaria a necessidade de chamar
strtotime()
e tornar as coisas um pouco menos intensivas no lado do PHP ...Então, no PHP, use a
date()
função para formatá-la da maneira que você desejar.ou
Eu gosto dessa abordagem em vez de usar o MySQL 's
DATE_FORMAT
função do , porque ela permite reutilizar a mesma consulta para pegar os dados e alterar a formatação no PHP.É irritante ter duas consultas diferentes apenas para alterar a aparência da data na interface do usuário.
fonte
UNIX_TIMESTAMP
para eliminar a necessidadestrtotime
. Essa resposta seria melhor se desse um exemplo de formatação da hora no formato que o OP realmente solicitou.Você pode ter problemas com datas não retornadas no carimbo de data e hora do Unix, portanto isso funciona para mim ...
fonte
Isso vai funcionar ...
fonte
Usando o PHP versão 4.4.9 e MySQL 5.0, isso funcionou para mim:
PubDate
é a coluna no MySQL .fonte
A abordagem que sugiro funciona da seguinte maneira. Primeiro, você cria um objeto datetime básico a partir de uma string no formato mysql; e então você formata do jeito que você gosta. Felizmente, o mysql datetime é compatível com ISO8601, portanto, o próprio código pode parecer bastante simples e elegante. Lembre-se de que a
datetime
coluna não possui informações de fuso horário; portanto, você precisa convertê-las adequadamente .Aqui está o código:
Produz
01/19/2038 11:14AM
- esperançosamente o que você espera.Este exemplo usa a biblioteca de merengue. Você pode conferir um pouco mais, se quiser.
fonte
fonte