Embora @drrcknlsn esteja correto ao afirmar que há várias maneiras de converter uma string de hora em data e hora, é importante perceber que essas diferentes maneiras não lidam com fusos horários da mesma maneira.
Opção 1 : DateTime('@' . $timestamp)
Considere o seguinte código:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
O strtotime
bit elimina as informações de fuso horário e a date_create
função assume GMT ( Europe/Brussels
).
Como tal, o resultado será o seguinte, independentemente do servidor em que o executar:
2011-12-12T13:17:52+00:00
Opção 2 : date_create()->setTimestamp($timestamp)
Considere o seguinte código:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Você pode esperar que isso produza a mesma saída. No entanto, se eu executar este código de um servidor belga, obtenho a seguinte saída:
2011-12-12T14:17:52+01:00
Ao contrário da date_create
função, o setTimestamp
método assume o fuso horário do servidor ( 'Europe/Brussels'
no meu caso) em vez de GMT.
Definir explicitamente o seu fuso horário
Se você quiser ter certeza de que sua saída corresponde ao fuso horário de sua entrada, é melhor defini-la explicitamente.
Considere o seguinte código:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Agora, considere também o seguinte código:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Como definimos explicitamente o fuso horário da saída para corresponder ao da entrada, ambos criarão a mesma saída (correta):
2011-12-12T21:17:52+08:00