Marca de tiempo de PHP en DateTime

4 minutos de lectura

avatar de usuario
JREAM

¿Sabes cómo puedo convertir esto en un strtotime, o un tipo de valor similar para pasar al Fecha y hora ¿objeto?

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, todas son la misma fecha.

avatar de usuario
FtDRbwLXw6

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

// 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 usar 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):

En realidad no era consciente de esto en ese momento, pero el DateTime constructor lo hace Admite la creación de instancias directamente a partir de marcas de tiempo. De acuerdo a esta documentacióntodo lo que necesita hacer es anteponer la marca de tiempo con un @ personaje:

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

  • Esto funciona muy bien. ¡Había intentado esto anteriormente, pero no debo haberle dado la oportunidad suficiente! Gracias :))

    – JREAM

    20 de agosto de 2012 a las 14:09

  • Tenga en cuenta que 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.

    – John Slegers

    20 de febrero de 2016 a las 16:29

  • pienso new DateTime("@$timestamp") puede ser más legible.

    – Manngo

    17 oct 2021 a las 5:41

  • Un poco más corto: $date = (new DateTime)->setTimestamp($timestamp);

    – Dión

    16 de mayo a las 14:25

avatar de usuario
Juan Slegers

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

los strtotime bit elimina la información de la zona horaria, y el date_create función asume GMT.

Como tal, el resultado será el siguiente, sin importar en qué servidor lo ejecute:

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

Opcion 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');

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 del date_create función, la setTimestamp El método asume la zona horaria del servidor (CET 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 configurarlo 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, 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 configuramos 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:00

Probablemente la solución más simple es simplemente:

DateTime::createFromFormat('U', $timeStamp);

Donde ‘U’ significa época Unix. Ver documentos: http://php.net/manual/en/datetime.createfromformat.php

  • Este método también ignora la zona horaria

    -Bouke Versteegh

    9 de noviembre de 2017 a las 14:23

  • @BoukeVersteegh y cuál no?

    – forsberg

    12 de noviembre de 2017 a las 7:12

  • @BoukeVersteegh ¡Esta es una marca de tiempo de Unix!, lo libera de problemas de zonas horarias al crear el objeto. Solo usa ->setTimezone para establecer la zona horaria preferible antes de llamar ->format()

    – Contador م

    6 de septiembre de 2019 a las 7:49


  • @BoukeVersteegh Mira esta gran nota del manual de php “El parámetro $timezone y la zona horaria actual se ignoran cuando el parámetro $time es una marca de tiempo UNIX (por ejemplo, @946684800) o especifica una zona horaria (por ejemplo, 2010-01-28T15:00:00+02:00).”

    – Contador م

    6 de septiembre de 2019 a las 7:54


  • Las marcas de tiempo de Unix no tienen zonas horarias, siempre son UTC por definición

    – Las nueces

    21 de septiembre de 2020 a las 5:43

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad