Corregir fechas de UTC (GMT0) a hora local (GMT +/- ??) en PHP

Siguiendo con el tema de las correcciones horarias, ahora le toca el turno a PHP.

Como comenté, si estamos haciendo una web que puede verse desde diferentes husos horarios, es interesante guardar las fechas y horas en UTC y pasarlas al huso horario del visitante a la hora de presentarlas.

Para hacerlo desde PHP necesitaremos encontrar ese dato mediante JavaScript y enviarlo o, mucho mas sencillo,  usar un huso horario por defecto y dar la opción de configurar el huso horario propio en el caso de usuarios registrados.

Para sacar una fecha localizada podomos usar:

//GMT+1 es París-Madrid....
$GMT = 1;
// Activamos el ahorro DST.
if (date('I')) $GMT++;

// Sacamos un timestamp modificado, teniendo en cuenta nuestra zona horaria
$timestamp = time()+$GMT * 3600;
// Obtenemos la fecha GMT, la cual, al haberle sumado la diferéncia horaria, nos indicará la hora localizada.
// hmdate obtiene la fecha GMT del timestam, teniendo en cuenta la desviación horária del servidor. Como nosotros hemos rectificado el timestamp, nos dará la fecha deseada.
$fecha = gmdate("j/n/Y, G:i:s",$timestamp);


Para obtener la fecha localizada a partir de una fecha que ya enemos (ej: BBDD), podemos usar:
//GMT+1 es París-Madrid....
$GMT = 1;
// Activamos el ahorro DST.
if (date('I')) $GMT++;
// Sacamos un timestamp modificado, teniendo en cuenta nuestra zona horaria
$timestamp = mktime($hora, $minuto + $GMT*60 , $segundo, $mes, $dia$año);
// Obtenemos la fecha GMT, la cual, al haberle sumado la diferéncia horaria, nos indicará la hora localizada.
// hmdate obtiene la fecha GMT del timestam, teniendo en cuenta la desviación horária del servidor. Como nosotros hemos rectificado el timestamp, nos dará la fecha deseada.
$fecha = gmdate("j/n/Y, G:i:s",$timestamp);

Substituyendo las variables $dia, $mes, etc, por los datos que ya tenemos obtenemos la fecha localizada.


Con ésto, podemos hacer un site adaptado al público internacional.


También te puede interesar la explicación para localizar las fechas desde UTC en JavaScript.


Edit: Errata: Añadido un "=" que faltaba en los ejemplos.



    Editado por Daniel el 16/01/2009 a las 09:25:44h.