Hola.
Estoy tratando de mostrar al usuario la diferencia GMT sobre un timezone dado.
Obtengo el timezone del usuario en formato string ej: 'America/Bogota' Y quisiera mostrar para los que no somos de alli la diferencia horaria: GMT -5
He creado estas tres maneras:
Código PHP:
Ver original<?
///////////// Sencilla funciona en php 5.2 ///////////////
//$timezone = 'America/Bogota';
//$timezone = 'Europe/Madrid';
$timezone = 'America/Caracas';
$objHoraUsuario= new DateTime();
$objHoraUsuario->setTimezone(new DateTimeZone($timezone));
$offset=$objHoraUsuario->getOffset();
$gmt=($offset/60)/60;
if($gmt<0){$tag="GMT ";}
else{$tag="GMT +";}
echo $tag . $gmt;
echo "<br>";
//////////////////////////En php 5.2 ////////////////////
//$timezone = 'America/Bogota';
$timezone = 'Europe/Madrid';
//$timezone = 'America/Caracas';
$timezoneinfo = new DateTimeZone($timezone);
$arraytime = $timezoneinfo->getTransitions();
$gmttime=0;
$i = 0;
foreach ($arraytime as $transicion)
{
if ($transicion['ts'] + $arraytime[$i]['offset'] >= $gmttime)
{
$indice = $i;
break;
}
$i ++;
}
$newtime = $gmttime + $arraytime[$indice]['offset'];
$gmt=($newtime/60)/60;
if($gmt<0){$tag="GMT ";}
else{$tag="GMT +";}
echo $tag . $gmt;
echo "<br>";
//////////////////////////A partir de php 5.3 ////////////////////
//$timezone = 'America/Bogota';
$timezone = 'Europe/Madrid';
//$timezone = 'America/Caracas';
// Calculamos la hora del timezone y la sumamos a la hora del servidor
$objHoraUsuario= new DateTime();
$objHoraUsuario->setTimezone(new DateTimeZone($timezone));
$offset=$objHoraUsuario->getOffset();
$objHoraUsuario->setTime(date('H'), date('i'), date('s')+$offset); echo $objHoraUsuario->format('Y-m-d H:i:s'); echo "<br>";
//Obtenemos la transicion desde la hora del usuario, sino cogeria la del servidor y cuando hay cambio de hora fallaria.
$timezoneinfo = new DateTimeZone($timezone);
$arraytime = $timezoneinfo->getTransitions($objHoraUsuario->format('U'),$objHoraUsuario->format('U'));
$gmttime=0;
$i = 0;
foreach ($arraytime as $transicion)
{
if ($transicion['ts'] + $arraytime[$i]['offset'] >= $gmttime)
{
$indice = $i;
break;
}
$i ++;
}
$newtime = $gmttime + $arraytime[$indice]['offset'];
$gmt=($newtime/60)/60;
if($gmt<0){$tag="GMT ";}
else{$tag="GMT +";}
echo $tag . $gmt;
?>
Parece que funciona, queria saber si creeis que funcionara bien siempre y de paso como me ha costado tanto encontrar informacion sobre ello compartirlo con vosotros.