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 strtotime
bit elimina la información de la zona horaria y la date_create
funció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: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');
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:00
A diferencia de la date_create
función, el setTimestamp
mé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:00