Você sabe como posso converter isso para um strtotime ou um tipo de valor semelhante para passar para o DateTime objeto ?
A data que tenho:
Mon, 12 Dec 2011 21:17:52 +0000
O que eu tentei:
$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');
O acima não está correto. Se eu percorrer várias datas diferentes, todas serão a mesma data.
fonte
new DateTime('@' . $timestamp)
e$dt = new DateTime(); $dt->setTimestamp($timestamp)
não trate os fusos horários da mesma maneira. Veja minha resposta @ stackoverflow.com/questions/12038558/… para mais detalhes.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 adate_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, osetTimestamp
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
fonte
Provavelmente, a solução mais simples é apenas:
DateTime::createFromFormat('U', $timeStamp);
Onde 'U' significa época Unix. Veja os documentos: http://php.net/manual/en/datetime.createfromformat.php
fonte
->setTimezone
para definir o fuso horário preferencial antes de ligar->format()
é a minha solução:
function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s") { $date = new DateTime($date, new DateTimeZone($from)); $date->setTimeZone(new DateTimeZone($to)); return $date->format($targetFormat); }
fonte