Zonas horarias en PHP

Script PHP para sacar un menú donde poder elegir la zona horaria deseada.

Otras de las grandes necesidades originadas por la distancia entre diferentes países y en algunos casos ciudades es la hora.

Por ejemplo: ¿Si un usuario se encuentra en cualquier parte del mundo, como hacer para que cuando emita una opinión, esta aparezca con su hora local ó de su zona horaria?

Para solucionar este gran problema y tantos otros relacionados con este género utilizaremos las zonas horarias de las principales ciudades del mundo.

Utilizaremos dos aspectos cruciales o decisivos la hora con respecto al meridiano de la ciudad local utilizada como base para calcular la diferencia con respecto a la ciudad distante tomando como referencia la hora del Meridiano de Greenwich u hora 0 (CERO).

Veamos el código fuente y luego la explicación como de costumbre:

<?

if(isset($_POST[hora])){

settype ($_POST[hora],»integer»);

settype ($_POST[min],»integer»);

settype ($_POST[seg],»integer»);

if($_POST[hora]<=0 OR $_POST[hora]>12){

echo ‘<strong> Hora incorrecta </strong>’;

}elseif($_POST[min]<=0OR $_POST[min]>60){

echo ‘<strong> Minutos incorrectos </strong>’;

}elseif($_POST[seg]<=0 OR $_POST[seg]>60){

echo ‘<strong> Segundos Incorrectos </strong>’;

}else{

$hor=$_POST[hora];

if($_POST[tm]==’pm’ && $_POST[hora]>=1 && $_POST[hora]<12){

$_POST[hora]+=12;

}

$total_minutos_=floor($_POST[hora]*60)+$_POST[min];

$dia=»del mismo día»;

if($_POST[ciudad1]>=0){ // es positiva la zona h

$gmt= (int) $total_minutos_-$_POST[ciudad1];

}else{ // es negativo

$_POST[ciudad1]= (int) $_POST[ciudad1]*-1;

$gmt= $total_minutos_+$_POST[ciudad1];

}

if($gmt<0){

$dia=’ del día anterior’;

$gmt+=1440; //minutos de 1 dia

}

if($_POST[ciudad2]>0){

$tiempo2=$_POST[ciudad2]+$total_minutos_;

}else{

$tiempo2=$_POST[ciudad2]+$gmt;

if($tiempo2 > 1440)

{

$dia = «del dia siguiente»;

$tiempo2-= 1440;

}

if ($tiempo2 < 0)

{

$dia = «del dia anterior»;

$tiempo2 += 1440;

}

}

$hora_de_la_otra_ciudad=floor($tiempo2/60);

echo ‘En la otra ciudad son: ‘.$hora_de_la_otra_ciudad.’ : ‘.$_POST[min].’ : ‘.$_POST[seg].’ ‘.$dia;

}

} ?>

<form action=»<? echo $PHP_SELF?>» method=»post»>Si en mi pc son las

<input name=»hora» type=»text» id=»hora» value=»<? echo $hor?>» size=»2″ maxlength=»2″>

:

<input name=»min» type=»text» id=»min» value=»<? echo $_POST[«min»] ?>» size=»2″ maxlength=»2″>

:

<input name=»seg» type=»text» id=»seg» value=»<? echo $_POST[«seg»] ?>» size=»2″ maxlength=»2″>

<select name=»tm» id=»tm»>

<option value=»am»>am</option>

<option value=»pm»>pm</option>

</select>

: y estoy en :

<SELECT name=ciudad1 size=1 id=»ciudad1″>

<OPTION value=180>Addis Ababa</OPTION>

<OPTION value=570>Adelaida</OPTION>

<OPTION value=180>Aden</OPTION>

<OPTION value=-360>Aklavik</OPTION>

<OPTION value=60>Argel</OPTION>

<OPTION value=120>Amman</OPTION>

<OPTION value=60>Amsterdam</OPTION>

<OPTION value=720>Anadyr</OPTION>

<OPTION value=120>Ankara</OPTION>

<OPTION value=180>Antananarivo</OPTION>

<OPTION value=-240>Asunció</OPTION>

<OPTION value=120>Atenas</OPTION>

<OPTION value=-300>Atlanta</OPTION>

<OPTION value=-360>Austin</OPTION>

<OPTION value=0>Azores</OPTION>

<OPTION value=180>Baghdad</OPTION>

<OPTION value=420>Bangkok</OPTION>

<OPTION value=60>Barcelona</OPTION>

<OPTION value=180>Beirut</OPTION>

<OPTION value=60>Belgrado</OPTION>

<OPTION value=60>Berlín</OPTION>

<OPTION value=-240>Bermuda</OPTION>

<OPTION value=60>Berna</OPTION>

<OPTION value=120>Biel</OPTION>

<OPTION value=-300>Bogotá</OPTION>

<OPTION value=-300>Boston</OPTION>

<OPTION value=-180>Brasilia</OPTION>

<OPTION value=600>Brisbane</OPTION>

<OPTION value=60>Bruselas</OPTION>

<OPTION value=120>Bucarest</OPTION>

<OPTION value=60>Budapest</OPTION>

<OPTION value=-180>Buenos Aires</OPTION>

<OPTION value=330>Calcuta</OPTION>

<OPTION value=-240 selected>Caracas</OPTION>

<OPTION value=0>Casablanca</OPTION>

<OPTION value=-300>Chicago</OPTION>

<OPTION value=120>Ciudad del Cabo</OPTION>

<OPTION value=60>Copenhague</OPTION>

<OPTION value=-360>Dallas</OPTION>

<OPTION value=180>Dar es Salaam</OPTION>

<OPTION value=570>Darwin</OPTION>

<OPTION value=-420>Denver</OPTION>

<OPTION value=-300>Detroit</OPTION>

<OPTION value=360>Dhaka</OPTION>

<OPTION value=0>Dublín</OPTION>

<OPTION value=-420>Edmonton</OPTION>

<OPTION value=120>Estambul</OPTION>

<OPTION value=60>Estocolmo</OPTION>

<OPTION value=180>El Cairo</OPTION>

<OPTION value=60>Francfort</OPTION>

<OPTION value=60>Ginebra</OPTION>

<OPTION value=-360>Guatemala</OPTION>

<OPTION value=420>Hanoi</OPTION>

<OPTION value=120>Harare</OPTION>

<OPTION value=120>Helsinki</OPTION>

<OPTION value=420>Ho Chi Minh City</OPTION>

<OPTION value=480>Hong Kong</OPTION>

<OPTION value=600>Honolulú</OPTION>

<OPTION value=-360>Houston</OPTION>

<OPTION value=-300>Indianápolis</OPTION>

<OPTION value=300>Islamabad</OPTION>

<OPTION value=420>Jakarta</OPTION>

<OPTION value=120>Jerusalén</OPTION>

<OPTION value=120>Johanesburgo</OPTION>

<OPTION value=270>Kabúl</OPTION>

<OPTION value=720>Kamchatka</OPTION>

<OPTION value=300>Kathmandú</OPTION>

<OPTION value=120>Khartoum</OPTION>

<OPTION value=120>Kigali</OPTION>

<OPTION value=-300>Kingston</OPTION>

<OPTION value=480>Kuala Lumpur</OPTION>

<OPTION value=180>Kuwait</OPTION>

<OPTION value=-240>La Habana</OPTION>

<OPTION value=-240>La Paz</OPTION>

<OPTION value=0>Las Palmas</OPTION>

<OPTION value=60>Lagos</OPTION>

<OPTION value=-300>Lima</OPTION>

<OPTION value=0>Lisboa</OPTION>

<OPTION value=0>Londres</OPTION>

<OPTION value=-480>Los Ángeles</OPTION>

<OPTION value=60>Madrid</OPTION>

<OPTION value=-360>Managua</OPTION>

<OPTION value=480>Manila</OPTION>

<OPTION value=240>Masqat</OPTION>

<OPTION value=600>Melburne</OPTION>

<OPTION value=-360>Méjico D.F.</OPTION>

<OPTION value=300>Miami</OPTION>

<OPTION value=60>Milán</OPTION>

<OPTION value=-360>Minneápolis</OPTION>

<OPTION value=-180>Montevideo</OPTION>

<OPTION value=-300>Montreal</OPTION>

<OPTION value=180>Moscú</OPTION>

<OPTION value=330>Mumbai</OPTION>

<OPTION value=60>Múnich</OPTION>

<OPTION value=180>Nairobi</OPTION>

<OPTION value=60>Nápoles</OPTION>

<OPTION value=-300>Nassau</OPTION>

<OPTION value=330>Nueva Delhi</OPTION>

<OPTION value=-360>Nueva Orleans</OPTION>

<OPTION value=-300>Nueva York</OPTION>

<OPTION value=60>Oslo</OPTION>

<OPTION value=-240>Ottawa</OPTION>

<OPTION value=60>París</OPTION>

<OPTION value=480>Pequín</OPTION>

<OPTION value=480>Perth</OPTION>

<OPTION value=-420>Phoenix</OPTION>

<OPTION value=420>Phnom Penh</OPTION>

<OPTION value=60>Praga</OPTION>

<OPTION value=540>Pyongyang</OPTION>

<OPTION value=0>Reikiavik</OPTION>

<OPTION value=-180>Río de Janeiro</OPTION>

<OPTION value=180>Riyadh</OPTION>

<OPTION value=60>Roma</OPTION>

<OPTION value=-240>St. John’s</OPTION>

<OPTION value=-360>St. Paul</OPTION>

<OPTION value=-480>San Francisco</OPTION>

<OPTION value=-240>San Juan</OPTION>

<OPTION value=-360>San Salvador</OPTION>

<OPTION value=-300>Santo Domingo</OPTION>

<OPTION value=-240>Santiago</OPTION>

<OPTION value=-180>Sao Paulo</OPTION>

<OPTION value=-480>Seattle</OPTION>

<OPTION value=540>Seúl</OPTION>

<OPTION value=480>Shanghai</OPTION>

<OPTION value=480>Singapur</OPTION>

<OPTION value=60>Sofía</OPTION>

<OPTION value=720>Suva</OPTION>

<OPTION value=600>Sydney</OPTION>

<OPTION value=480>Taipei</OPTION>

<OPTION value=120>Tallinn</OPTION>

<OPTION value=300>Tashkent</OPTION>

<OPTION value=-210>Teherán</OPTION>

<OPTION value=540>Tokio</OPTION>

<OPTION value=-300>Toronto</OPTION>

<OPTION value=60>Turín</OPTION>

<OPTION value=-300>Vancúver</OPTION>

<OPTION value=60>Varsovia</OPTION>

<OPTION value=60>Venecia</OPTION>

<OPTION value=60>Viena</OPTION>

<OPTION value=600>Vladivostok</OPTION>

<OPTION value=-300>Washington</OPTION>

<OPTION value=720>Wellington</OPTION>

<OPTION value=-360>Winnipeg</OPTION>

<OPTION value=390>Yangon</OPTION>

<OPTION value=60>Zagreb</OPTION>

<OPTION value=60>Zurich</OPTION>

</SELECT>

<br>

Entonces en

<SELECT name=ciudad2 size=1 id=»ciudad2″>

<OPTION value=180>Addis Ababa</OPTION>

<OPTION value=570>Adelaida</OPTION>

<OPTION value=180>Aden</OPTION>

<OPTION value=-360>Aklavik</OPTION>

<OPTION value=60>Argel</OPTION>

<OPTION value=120>Amman</OPTION>

<OPTION value=60>Amsterdam</OPTION>

<OPTION value=720>Anadyr</OPTION>

<OPTION value=120>Ankara</OPTION>

<OPTION value=180>Antananarivo</OPTION>

<OPTION value=-240>Asunció</OPTION>

<OPTION value=120>Atenas</OPTION>

<OPTION value=-300>Atlanta</OPTION>

<OPTION value=-360>Austin</OPTION>

<OPTION value=0>Azores</OPTION>

<OPTION value=180>Baghdad</OPTION>

<OPTION value=420>Bangkok</OPTION>

<OPTION value=60>Barcelona</OPTION>

<OPTION value=180>Beirut</OPTION>

<OPTION value=60>Belgrado</OPTION>

<OPTION value=60>Berlín</OPTION>

<OPTION value=-240>Bermuda</OPTION>

<OPTION value=60>Berna</OPTION>

<OPTION value=120>Biel</OPTION>

<OPTION value=-300>Bogotá</OPTION>

<OPTION value=-300>Boston</OPTION>

<OPTION value=-180>Brasilia</OPTION>

<OPTION value=600>Brisbane</OPTION>

<OPTION value=60>Bruselas</OPTION>

<OPTION value=120>Bucarest</OPTION>

<OPTION value=60>Budapest</OPTION>

<OPTION value=-180>Buenos Aires</OPTION>

<OPTION value=330>Calcuta</OPTION>

<OPTION value=-240>Caracas</OPTION>

<OPTION value=0>Casablanca</OPTION>

<OPTION value=-300>Chicago</OPTION>

<OPTION value=120>Ciudad del Cabo</OPTION>

<OPTION value=60>Copenhague</OPTION>

<OPTION value=-360>Dallas</OPTION>

<OPTION value=180>Dar es Salaam</OPTION>

<OPTION value=570>Darwin</OPTION>

<OPTION value=-420>Denver</OPTION>

<OPTION value=-300>Detroit</OPTION>

<OPTION value=360>Dhaka</OPTION>

<OPTION value=0>Dublín</OPTION>

<OPTION value=-420>Edmonton</OPTION>

<OPTION value=120>Estambul</OPTION>

<OPTION value=60>Estocolmo</OPTION>

<OPTION value=180>El Cairo</OPTION>

<OPTION value=60>Francfort</OPTION>

<OPTION value=60>Ginebra</OPTION>

<OPTION value=-360>Guatemala</OPTION>

<OPTION value=420>Hanoi</OPTION>

<OPTION value=120>Harare</OPTION>

<OPTION value=120>Helsinki</OPTION>

<OPTION value=420>Ho Chi Minh City</OPTION>

<OPTION value=480>Hong Kong</OPTION>

<OPTION value=600>Honolulú</OPTION>

<OPTION value=-360>Houston</OPTION>

<OPTION value=-300>Indianápolis</OPTION>

<OPTION value=300>Islamabad</OPTION>

<OPTION value=420>Jakarta</OPTION>

<OPTION value=120>Jerusalén</OPTION>

<OPTION value=120>Johanesburgo</OPTION>

<OPTION value=270>Kabúl</OPTION>

<OPTION value=720>Kamchatka</OPTION>

<OPTION value=300>Kathmandú</OPTION>

<OPTION value=120>Khartoum</OPTION>

<OPTION value=120>Kigali</OPTION>

<OPTION value=-300>Kingston</OPTION>

<OPTION value=480>Kuala Lumpur</OPTION>

<OPTION value=180>Kuwait</OPTION>

<OPTION value=-240>La Habana</OPTION>

<OPTION value=-240>La Paz</OPTION>

<OPTION value=0>Las Palmas</OPTION>

<OPTION value=60>Lagos</OPTION>

<OPTION value=-300>Lima</OPTION>

<OPTION value=0>Lisboa</OPTION>

<OPTION value=0>Londres</OPTION>

<OPTION value=-480>Los Ángeles</OPTION>

<OPTION value=60>Madrid</OPTION>

<OPTION value=-360>Managua</OPTION>

<OPTION value=480>Manila</OPTION>

<OPTION value=240>Masqat</OPTION>

<OPTION value=600>Melburne</OPTION>

<OPTION value=-360>Méjico D.F.</OPTION>

<OPTION value=300>Miami</OPTION>

<OPTION value=60>Milán</OPTION>

<OPTION value=-360>Minneápolis</OPTION>

<OPTION value=-180>Montevideo</OPTION>

<OPTION value=-300>Montreal</OPTION>

<OPTION value=180>Moscú</OPTION>

<OPTION value=330>Mumbai</OPTION>

<OPTION value=60>Múnich</OPTION>

<OPTION value=180>Nairobi</OPTION>

<OPTION value=60>Nápoles</OPTION>

<OPTION value=-300>Nassau</OPTION>

<OPTION value=330>Nueva Delhi</OPTION>

<OPTION value=-360>Nueva Orleans</OPTION>

<OPTION value=-300>Nueva York</OPTION>

<OPTION value=60>Oslo</OPTION>

<OPTION value=-240>Ottawa</OPTION>

<OPTION value=60>París</OPTION>

<OPTION value=480>Pequín</OPTION>

<OPTION value=480>Perth</OPTION>

<OPTION value=-420>Phoenix</OPTION>

<OPTION value=420>Phnom Penh</OPTION>

<OPTION value=60>Praga</OPTION>

<OPTION value=540>Pyongyang</OPTION>

<OPTION value=0>Reikiavik</OPTION>

<OPTION value=-180>Río de Janeiro</OPTION>

<OPTION value=180>Riyadh</OPTION>

<OPTION value=60>Roma</OPTION>

<OPTION value=-240>St. John’s</OPTION>

<OPTION value=-360>St. Paul</OPTION>

<OPTION value=-480>San Francisco</OPTION>

<OPTION value=-240>San Juan</OPTION>

<OPTION value=-360>San Salvador</OPTION>

<OPTION value=-300>Santo Domingo</OPTION>

<OPTION value=-240>Santiago</OPTION>

<OPTION value=-180>Sao Paulo</OPTION>

<OPTION value=-480>Seattle</OPTION>

<OPTION value=540>Seúl</OPTION>

<OPTION value=480>Shanghai</OPTION>

<OPTION value=480>Singapur</OPTION>

<OPTION value=60>Sofía</OPTION>

<OPTION value=720>Suva</OPTION>

<OPTION value=600>Sydney</OPTION>

<OPTION value=480>Taipei</OPTION>

<OPTION value=120>Tallinn</OPTION>

<OPTION value=300>Tashkent</OPTION>

<OPTION value=-210>Teherán</OPTION>

<OPTION value=540>Tokio</OPTION>

<OPTION value=-300>Toronto</OPTION>

<OPTION value=60>Turín</OPTION>

<OPTION value=-300>Vancúver</OPTION>

<OPTION value=60>Varsovia</OPTION>

<OPTION value=60>Venecia</OPTION>

<OPTION value=60>Viena</OPTION>

<OPTION value=600>Vladivostok</OPTION>

<OPTION value=-300 selected>Washington</OPTION>

<OPTION value=720>Wellington</OPTION>

<OPTION value=-360>Winnipeg</OPTION>

<OPTION value=390>Yangon</OPTION>

<OPTION value=60>Zagreb</OPTION>

<OPTION value=60>Zurich</OPTION>

</SELECT>

son

<input type=»submit» value=»Ver hora»></form>

Explicación:

Primero que nada iniciaremos una condición para comprobar si $_POST[hora] se ha definido en algún momento a través de la función isset(); ( solo tomara valor cuando se envíen datos a través de HTTP-POST )

Cambiaremos el tipo de dato de $_POST[hora], $_POST[min] y $_POST[segundo] de String o Cadena a Integer o Entero a través de la función settype():

Realizaremos una validación con una serie de condiciones para comprobar:

Sí El Valor es menor que 0 (cero) o mayor que 12 ó 60 según sea el caso, de ser contrarias todas estas situaciones iniciaremos el ensamblaje de una serie de instrucciones.

Condición: if($_POST[tm]==’pm’ && $_POST[hora]>=1 && $_POST[hora]<12)

Expresamos si la hora es PM pero además esa hora debe ser mayor o igual que 1 y menor a 12, pues si evalúa TRUE nos hará llevar la hora a en base 24 :

Por ejemplo: si se inserta 1 HORA PM debemos llevarlo a 13 horas, para ello sumamos $_POST[hora] más 12 horas transcurridas como constante.

Luego asociamos a la variable $total_minutos_el valor devuelto por la multiplicación entre $_POST[hora] y 60 más los minutos “$_POST[min]” redondeado hacia abajo mediante la función matemática floor(), para llevar la expresión de Hora:Minutos a minutos totales.

Definimos el valor de la variable $dia, este valor se mantendrá siempre y cuando las circunstancias así lo toleran, pues puede ser cambiado o remplazado si alguna de las condiciones subsiguientes evalúa TRUE.

Sí $_POST[ciudad1] es mayor o igual a 0,

Recordemos que el valor de $_POST[ciudad1] será la hora con respecto al meridiano de la ciudad tomada como referencia, Ese entero puede ser negativo o positivo y esta condición evaluara TRUE solo si es positivo; para realizar una resta entre $total_minutos_ y el valor de $_POST[ciudad1] asociándolo a la variable $gmt.

De lo contrario a sí $_POST[ciudad1] es mayor o igual a 0,

Quiere decir que $_POST[ciudad1] es negativo y lo pasaremos a positivo, multiplicándolo por -1 .

$_POST[ciudad1]*-1;

Y realizamos una suma entre $_POST[ciudad1] y $total_minutos_, lo contrario del caso anterior.

¿ Para que y con que sentido?

Debemos determinar si el valor resultante es positivo o negativo para constatar si la diferencia es del día anterior o del día siguiente.

Si es menor a 0 (negativo)

Cambiamos el valor anteriormente asignado a $dia por día anterior y le agregamos a $gmt “1440” minutos totales de un día.

Sí $_POST[ciudad2] es mayor que 0 , esta hacia el ESTE del meridiano

Sumamos $tiempo2 y $total_minutos_, y lo asociamos a $tiempo2.

De lo contrario a Sí $_POST[ciudad2] es mayor que 0.

Realizamos un operación similar a la anterior pero esta vez le sumamos el valor de $gmt, definido en procesos anteriores.

Dentro de ese marco realizamos dos condiciones mas:

Si $tiempo2 es mayor que el total de minutos de un día (1440), entonces es el día siguiente.

Si $tiempo2 es menor que 0 entonces es del día anterior.

Finalmente sin importar la rutina empleada retornamos el resultado, transformando esos minutos resultantes en horas : para ello lo dividiremos entre 60 y redondeamos ese valor hacia abajo, asociamos el resultado a la variable: $hora_de_la_otra_ciudad

Y damos salida al navegador por medio de un echo.

Leave A Comment?