¿Sabes cómo puedo convertir esto en un strtotime o un tipo de valor similar para pasar al objeto DateTime ?
La fecha que tengo:
Mon, 12 Dec 2011 21:17:52 +0000
Lo que he probado:
$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');
Lo anterior no es correcto. Si recorro muchas fechas diferentes, es la misma fecha.
fuente

new DateTime('@' . $timestamp)y$dt = new DateTime(); $dt->setTimestamp($timestamp)no trate las zonas horarias de la misma manera. Consulte mi respuesta @ stackoverflow.com/questions/12038558/… para obtener más detalles.Si bien @drrcknlsn tiene razón al afirmar que hay varias formas de convertir una cadena de tiempo en un tiempo de datos, es importante darse cuenta de que estas diferentes formas no tratan con las zonas horarias de la misma manera.
Opción 1 :
DateTime('@' . $timestamp)Considere el siguiente código:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');El
strtotimebit elimina la información de la zona horaria y ladate_createfunción asume GMT (Europe/Brussels).Como tal, el resultado será el siguiente, sin importar en qué servidor lo ejecute:
2011-12-12T13:17:52+00:00Opcion 2 :
date_create()->setTimestamp($timestamp)Considere el siguiente código:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');Es de esperar que esto produzca el mismo resultado. Sin embargo, si ejecuto este código desde un servidor belga, obtengo el siguiente resultado:
2011-12-12T14:17:52+01:00A diferencia de la
date_createfunción, elsetTimestampmétodo asume la zona horaria del servidor ('Europe/Brussels'en mi caso) en lugar de GMT.Establecer explícitamente su zona horaria
Si desea asegurarse de que su salida coincida con la zona horaria de su entrada, es mejor establecerla explícitamente.
Considere el siguiente código:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')Ahora, considere también el siguiente código:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')Debido a que establecemos explícitamente la zona horaria de la salida para que coincida con la de la entrada, ambos crearán la misma salida (correcta):
2011-12-12T21:17:52+08:00fuente
Probablemente la solución más simple sea simplemente:
DateTime::createFromFormat('U', $timeStamp);Donde 'U' significa época Unix. Ver documentos: http://php.net/manual/en/datetime.createfromformat.php
fuente
->setTimezonepara establecer la zona horaria preferible antes de llamar->format()es mi solucion:
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); }fuente