Cambiar de zona horaria una fecha/hora en PHP

Definir las zonas horarias de orígen ($sourceDate) y destino (a convertir) .

$sourceTimeZone = 'utc';
$targetTimeZone = 'America/Bogota';

Separar los componentes de la fecha de orígen que se encuentra en formato ‘m/d/y h:m:s’.

list($month, $day, $year, $hours, $minutes, $seconds) = sscanf($sourceDate, "%d/%d/%d %d:%d:%f");

Construír el objeto DateTime indicándole la fecha y la zona horaria en la que se encuentra.

$datetime = new DateTime("{$year}-{$month}-{$day} {$hours}:{$minutes}:{$seconds}",
                         new DateTimeZone($sourceTimeZone));

Modificar la zona horaria del DateTime a la zona horaria destino.

$datetime -> setTimezone(new DateTimeZone($targetTimeZone));

Obtener los componentes de la nueva fecha con la zona horaria modificada.

list($month2, $day2, $year2, $hours2, $minutes2, $seconds2) =
    sscanf($datetime -> format('m/d/Y H:i:s'), "%d/%d/%d %d:%d:%f");

Muestra las fechas.

echo "En {$sourceTimeZone}: {$day}/{$month}/{$year} {$hours}:{$minutes}:{$seconds}<br/>";
echo "En {$targetTimeZone}: {$day2}/{$month2}/{$year2} {$hours2}:{$minutes2}:{$seconds2}<br/>";

4 thoughts on “Cambiar de zona horaria una fecha/hora en PHP”

  1. Saludos. Estoy probando el código, pero no obtengo la conversión correctamente.

    La fecha origen la definí como:

    $sourceDate = date(m/d/Y H:i:s);

    Pero obtengo:

    En utc: 24/7/2009 8:46:14
    En America/Bogota: 7/0// 2:4:/

    El código lo copié bien, y probé también con distintas zonas horarias de origen/destino. ¿Estaré haciendo algo mal? Tengo con PHP 5.2.9-2 con Windows.

    Muchas gracias. Bye.

    1. Saludos @hsimpson. Gracias por tu comentario.

      Estuve revisando el código y encontré que la fecha convertida a la nueva zona horaria está bien, el problema sucede en la extracción de las partes de la fecha.

      Para corregir el problema reemplaza la línea del segundo ‘list’ con la siguiente.

      list($month2, $day2, $year2, $hours2, $minutes2, $seconds2) = sscanf($datetime -> format(‘m/d/Y H:i:s’), “%d/%d/%d %d:%d:%f”);

      Me imagino que habrás notado que la fecha que pones en el ejemplo está en formato “d/m/Y H:i:s” así que se tendría que reordenar los elementos del primer ‘list’ para que correspondan adecuadamente.

      Voy a corregir el artículo con la mejora.

  2. Ojo. En mi comentario anterior, donde definí la fecha origen salieron barras inversas (back-slashes) en vez de comillas.

Leave a Reply

Your email address will not be published. Required fields are marked *