> Manuales > Taller de 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.

Emmanuel García De Caro

Webmaster de Blasten.com

Manual