Como faço para converter datetime para ISO 8601 em PHP

103

Como faço para converter meu horário 2010-12-30 23:21:46para o formato de data ISO 8601? (-_-;)

Uau
fonte
1
@Gordon sim, obtive cerca de 4.530 resultados e encontrei uma resposta de @alex
uau,
@wow, indique por que nenhum dos 4530 resultados respondeu à sua pergunta.
Gordon
1
@Gordon Ainda estou aprendendo a escrever de A a Z, mas descobri que eles me ensinam a escrever de Z a A :)
uau,
@wow Não. Eles ensinam como escrever o alfabeto ($ from, $ to). Quase todos eles dizem para você usar date($format, strtotime($dateString))ou o DateTimeequivalente do objeto. Eles diferem apenas na entrada para essas funções. Tudo que você precisa fazer é ir para as páginas correspondentes no Manual do PHP e descobrir quais são as entradas.
Gordon
3
@Gordon Sim, você está correto. Eu só conhecia o alfabeto e agora era hora de soletrar. Espero que eu esteja na escola certa.
uau,

Respostas:

229

Orientado a Objeto

Esta é a forma recomendada.

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DateTime::ATOM); // Updated ISO8601

Processual

Para versões mais antigas do PHP, ou se você estiver mais confortável com o código procedural.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));
alex
fonte
3
Pergunta, a saída é 2010-12-30T23:21:46+1100como fazer isso ser 2010-12-30T23:21:46+11:00?
uau,
2
@wow Experimente isso preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Ele produz 2010-12-30T23:21:46+11:00.
alex,
12
date('c', strtotime('2010-12-30 23:21:46'))legal @Gordon :)
nossa,
8
Eu observaria que usar DATE_ISO8601produz uma string de data que é ligeiramente diferente de ISO8601 (os dois pontos estão faltando no TZ, ISO8601 espera que os tempos sejam todos OU todos sem os dois pontos, não uma mistura) - date('c')produz uma data válida ISO 8601 estrita - Isso pode causar erros de rastreamento difícil se o código esperar um formato de data e hora ISO 8601 estrito. Ref: en.wikipedia.org/wiki/ISO_8601
ckm
38

Após o PHP 5, você pode usar isto: echo date("c");formulário de data e hora formatado em ISO 8601.

http://ideone.com/nD7piL

Nota para comentários:

Em relação a isso , essas duas expressões são válidas para fuso horário, para formato básico: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Mas observe que + 0X: 00 está correto e + 0X00 está incorreto para uso prolongado. Portanto, é melhor usar date("c"). Uma discussão semelhante aqui .

trante
fonte
1
Observe a ligeira diferença com DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck de
@ Ja͢ck isso precisa de votação negativa, então? Uma ligeira diferença geralmente é uma má ideia.
rybo111
@ rybo111 Não vejo razão para votar contra esta resposta; tecnicamente, ambos 'c'e DATE_ISO8601produzem representações de tempo ISO8601 válidas.
Ja͢ck
Eu adicionei uma nota para responder.
trante
@ Ja͢ck DATE_ISO8601não produz uma representação ISO8601 válida. DATE_ATOM, entretanto
Capitão Óbvio
4

Como converter de ISO 8601 para unixtimestamp:

strtotime('2012-01-18T11:45:00+01:00');
// Output : 1326883500

Como converter de unixtimestamp para ISO 8601 (servidor de fuso horário):

date_format(date_timestamp_set(new DateTime(), 1326883500), 'c');
// Output : 2012-01-18T11:45:00+01:00

Como converter de unixtimestamp para ISO 8601 (GMT):

date_format(date_create('@'. 1326883500), 'c') . "\n";
// Output : 2012-01-18T10:45:00+00:00

Como converter de unixtimestamp para ISO 8601 (fuso horário personalizado):

date_format(date_timestamp_set(new DateTime(), 1326883500)->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2012-01-18T05:45:00-05:00
John Slegers
fonte
1

Se você tentar definir um valor em datetime-local

date("Y-m-d\TH:i",strtotime('2010-12-30 23:21:46'));

//output : 2010-12-30T23:21
Rúbia Alves
fonte
Solução semelhante é mencionada nos comentários dados à resposta aceita
sushant047