new day php date datetime date-format time-format

php - day - strtotime to date



Marca de tiempo de PHP en DateTime (4)

Mientras que @drrcknlsn es correcto para afirmar que hay varias formas de convertir una cadena de tiempo en un tiempo de datos, es importante darse cuenta de que estas formas diferentes no se ocupan de las zonas horarias de la misma manera.

Opción 1: DateTime(''@'' . $timestamp)

Considera el siguiente código:

date_format(date_create(''@''. strtotime(''Mon, 12 Dec 2011 21:17:52 +0800'')), ''c'');

El bit strtotime elimina la información de zona horaria y la función date_create asume GMT ( Europe/Brussels ).

Como tal, la salida será la siguiente, no importa en qué servidor lo ejecute:

2011-12-12T13:17:52+00:00

Opción 2: date_create()->setTimestamp($timestamp)

Considera el siguiente código:

date_format(date_create()->setTimestamp(strtotime(''Mon, 12 Dec 2011 21:17:52 +0800'')), ''c'');

Puede 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:00

A diferencia de la función date_create , el método setTimestamp asume el huso horario 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, lo mejor es configurarla de forma explícita.

Considera 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, también considere 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 el mismo resultado (correcto):

2011-12-12T21:17:52+08:00

¿Sabes cómo puedo convertir esto a 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 intentado:

$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.


No necesita convertir la cadena en una marca de tiempo para crear el objeto DateTime (de hecho, su constructor ni siquiera le permite hacer esto, como puede ver). Simplemente puede alimentar su cadena de fecha en el constructor DateTime tal como está:

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000" $dt = new DateTime($item->pubDate);

Dicho esto, si tiene una marca de tiempo que desea utilizar en lugar de una cadena, puede hacerlo usando DateTime::setTimestamp() :

$timestamp = strtotime(''Mon, 12 Dec 2011 21:17:52 +0000''); $dt = new DateTime(); $dt->setTimestamp($timestamp);

Editar (2014-05-07):

De hecho, no era consciente de esto en ese momento, pero el constructor de DateTime admite la creación de instancias directamente a partir de marcas de tiempo. De acuerdo con esta documentación , todo lo que necesita hacer es anteponer la marca de tiempo con un carácter @ :

$timestamp = strtotime(''Mon, 12 Dec 2011 21:17:52 +0000''); $dt = new DateTime(''@'' . $timestamp);



es mi solución:

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); }