Converter de data e hora do MySQL para outro formato com PHP

447

Eu tenho uma datetimecoluna no MySQL.

Como posso convertê-lo para a exibição em mm / dd / aa H: M (AM / PM) usando PHP?

Tim Boland
fonte
4
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

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

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)

kta
fonte
19
esta resposta é confundir o tema
Alex K
5
@ 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)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Consulte as opções de formatação de data do PHP para ajustar o formato.

Tim Boland
fonte
De onde é esse $rowobjeto?
Mike
25
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

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");
enobrev
fonte
Como mencionado acima nos comentários, o formato padrão é("Y-m-d H:i:s")
Yannickv 13/11/14
45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Referência: http://php.net/manual/en/function.date.php

Tony Stark
fonte
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)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');
Hasenpriester
fonte
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
Contador م
12

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.

instantâneo
fonte
11
-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".
Boris Šuška
10

Esqueça tudo. Apenas use:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))
nixis
fonte
9

Para formatar corretamente um DateTimeobjeto 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.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

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

Greg
fonte
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
riz
fonte
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'.
toxalot
7

Use a função de data :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>
Gustavo Carreno
fonte
25
A função date () não espera um registro de data e hora inteiro em vez de um data e hora especificados na pergunta?
Loftx #
5

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:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Ou um pouco mais adiantado para combinar com a pergunta.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}
tfont
fonte
1
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.

Rangel
fonte
3

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.

phatduckk
fonte
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)))
matt.j.crawford
fonte
1
Isso não converte a data no formato solicitado pelo OP.
toxalot
1

Isso vai funcionar ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));
Mihir Vadalia
fonte
1
Esse formato combina 24 horas com AM / PM. Caso contrário, é o mesmo que a resposta aceita publicada há mais de 5 anos.
toxalot
0

Usando o PHP versão 4.4.9 e MySQL 5.0, isso funcionou para mim:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateé a coluna no MySQL .

Peter Mortensen
fonte
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(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

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.

Vadim Samokhin
fonte
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
fonte
1
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.
toxalot