/ / PHP: ¿Cómo convierto una marca de tiempo del servidor a la zona horaria del usuario? - php, zona horaria, marca de tiempo

PHP: ¿Cómo convierto una marca de tiempo del servidor en la zona horaria del usuario? - php, zona horaria, marca de tiempo

Actualmente estoy almacenando tiempos usando el "tiempo ()"Función en la base de datos. Sin embargo, está usando la zona horaria del servidor, y me gustaría que cada usuario vea la hora según su zona horaria (establecida en su perfil).

¿Cómo hago la conversión de la marca de tiempo? (y me refiero de marca de tiempo a marca de tiempo, no a tiempo legible)

Respuestas

9 para la respuesta № 1

Como dijo Joonas, las marcas de tiempo de UNIX son, por definición, UTC, pero podrías hackear algo como esto para imitar las marcas de tiempo específicas de la zona horaria si realmente necesitas:

// PHP 5.3 - OO Code
$timestamp = time();
echo "Unix timestamp: " . $timestamp;
$dt = DateTime::createFromFormat("U", $timestamp);
$dt->setTimeZone(new DateTimeZone("America/New_York"));
$adjusted_timestamp = $dt->format("U") + $dt->getOffset();
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;

// PHP 5.3 - Procedural Code
$timestamp = time();
echo "Unix timestamp: " . $timestamp;
$dt = date_create_from_format("U", $timestamp);
date_timezone_set($dt, new DateTimeZone("America/New_York"));
$adjusted_timestamp = date_format($dt, "U") + date_offset_get($dt);
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;

2 para la respuesta № 2

Realmente, no debe piratear las marcas de tiempo para cambiar la fecha, solo debe aplicar la zona horaria a la marca de tiempo antes de presentar la marca de fecha con formato al usuario.

Esta es una versión modificada del código de Mike que debería funcionar para PHP 5> = 5.2.0 como se encuentra en php.net

// OO Code
$st = 1170288000 //  a timestamp
$dt = new DateTime("@$st");
$dt->setTimeZone(new DateTimeZone("America/New_York"));
$adjusted_timestamp = $dt->format("U") + $dt->getOffset();
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;

// Procedural Code
$st = 1170288000 //  a timestamp
$dt = date_create("@$st");
date_timezone_set($dt, timezone_open("America/New_York"));
$adjusted_timestamp = date_format($dt, "U") + date_offset_get($dt);
echo " Timestamp adjusted for America/New_York: " . $adjusted_timestamp;

1 para la respuesta № 3

Las marcas de tiempo de UNIX están por definición en UTC, lo que significa que todas las conversiones deben realizarse justo antes de imprimir en lugar de con las marcas de tiempo reales.

Sin embargo, la forma de hacerlo depende de cómo se estén formateando en la actualidad. Creo que PHP ha incorporado el manejo de la zona horaria.