Foros del Web » Programando para Internet » PHP »

Calcular desfase horario segun la zona

Estas en el tema de Calcular desfase horario segun la zona en el foro de PHP en Foros del Web. Buenas, tengo un problema con el desfase horario para una aplicacion: Sabiendo que mi desfase horario es de 3600 segundos (España), y el servidor está ...
  #1 (permalink)  
Antiguo 03/03/2011, 21:17
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Calcular desfase horario segun la zona

Buenas, tengo un problema con el desfase horario para una aplicacion:

Sabiendo que mi desfase horario es de 3600 segundos (España), y el servidor está en USA (-21600)

Como podria calcular en una funcion general en PHP?

No puedo hacer una resta, por que en realidad seria una suma, y restarlo... todo depende de los signos... pero supongo que habrá alguna forma de hacerlo con las funciones nativas de php.

Un saludo!
  #2 (permalink)  
Antiguo 03/03/2011, 21:27
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: Calcular desfase horario segun la zona

Puedes hacerlo directamente seteando el timezone:
Código PHP:
// Establecer la zona horaria predeterminada a usar. Disponible desde PHP 5.1
date_default_timezone_set('UTC'); 
Fijate aca y aca estan los timezones soportados.

En una de esas puedes generar una funcion en donde le pases como parametro una hora y el timezone para que puedas convertir las dos horas a un solo timezone y luego restarlas. Este valor lo puedes poner con la funcion abs() y siempre tendras la diferencia en positivo.

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 03/03/2011, 21:44
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

A ver por que has buscado lo mismo que llevo yo buscando un par de horas...

Con date("Z") sacariamos el desfase en segudos del servidor, por ejemplo en este caso -21600, si a eso le resto 3600 tenemos -25200 (7 horas).

Si el server es negativo y el desfase del user es positivo tiene que sumarselas, si el server es positivo y el desfase del user es positivo pero menos que el desfase del server tiene que restarselas y si es mas tiene que sumarselas....

Enserio no hay una forma mas sencilla???

Demasiados ifs para una cosa que se supone que es un problema cootidiano en cualquier proyecto a escala mundial.
  #4 (permalink)  
Antiguo 03/03/2011, 21:49
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

Otra opcion... pero que no se si se puede
Obtener a partir de los milisegundos el nombre de la zona horaria??

Si tengo el nombre de la zona horaria puedo poner para ese script la fase horaria date_default_timezone_get($nombreZona)

Como saco la fase horaria desde los milisegundos?
  #5 (permalink)  
Antiguo 03/03/2011, 22:04
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: Calcular desfase horario segun la zona

La verdad es que esa es la opcion mas rapida que he encontrado y aun asi en todos lados mencionan que tampoco es 100% fiable puesto que php esta del lado del servidor y eso ya implica que vas a interpretar lo que te llegue (en terminos de peticion)

Creo que mas efectivo para lo que quieres lograr seria usar javascript.

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #6 (permalink)  
Antiguo 03/03/2011, 22:09
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

Pero con JS obtengo el desfase, o simplemente el usuario marcando de un select... ahora.. una vez ya se que su desfase es de 3600 , es decir, una hora, tengo que procesar todas las fechas que el vea... por ejemplo, si yo veo un comentario tuyo que estas en chile, no tiene que salirme tu hora, tiene que salirme la que sea proporcional en mi horario... y al contrario contigo.

Vamos, que el desfase horario del usuario lo tengo, por eso no te preocupes... ahora lo que necesito saber es que hora será para un usuario de cualquier parte del mundo... :S
  #7 (permalink)  
Antiguo 03/03/2011, 22:25
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

mmmm no se si hice bien esto por que es un quebradero de cabeza:

Código PHP:
Ver original
  1. function desfase($fecha, $desfaseUser){
  2.     $desfaseServer = date("Z");
  3.     $desfase = abs(abs($desfaseServer) - abs($desfaseUser));
  4.         // Si es menor que cero
  5.         if($desfase != 0){
  6.             if($desfaseServer < $desfaseUser){
  7.             $desfaseFinal = $desfaseServer + $desfase;
  8.             }else{
  9.             $desfaseFinal = $desfaseServer - $desfase;
  10.             }
  11.         }
  12.     return $fecha + $desfaseFinal;
  13.     }
  14.     // $nuevoTime = desfase(time(), 3600);
  15.     // echo date("H:i:s", $nuevoTime)


Como lo ves??
  #8 (permalink)  
Antiguo 04/03/2011, 21:41
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

Pues si que funciona bien la funcion... al hacerla rapido y despues de tanto estar con fechas ya no veia con claridad los resultados en las pruebas... pero ahora sin estar todo el dia en el ordenador, he hecho tests y parece que si que va bien...

echo date("d/m/Y H:i:s",desfase($fechaComent, $desfaseUsuario));
Te da la fecha exacta del post del comentario... para saber cuantos minutos hace, yo uso esta funcion:

Código PHP:
Ver original
  1. function haceCuanto($fecha, $fecha_final){
  2. //$lenguaje=$_SESSION['LANGUAGE'];
  3. //include(includeFile($lenguaje.'.php'));
  4.  
  5. $lang = array(
  6.             'segundo' => 'segundo',
  7.             'segundos' => 'segundos',
  8.             'minutos' => 'minutos',
  9.             'minuto' => 'minuto',
  10.             'hora' => 'hora',
  11.             'horas' => 'horas',
  12.             'aproximadamente' => 'aproximádamente',
  13.             'dias' => 'días',
  14.             'dia' => 'dia',
  15.             'ano' => 'año',
  16.             'anos' => 'años',
  17.             'mes' => 'mes',
  18.             'meses' => 'meses',
  19.             );
  20.  
  21.     // Función creada por Iván Ibarra [www.famezstudios.com]
  22.  
  23.     $fecha = $fecha - $_SESSION['WP']['TIMEZONE'];
  24.     $fecha_final = $fecha_final - $_SESSION['WP']['TIMEZONE'];
  25.    
  26.    
  27.    
  28.     $tiempo = $fecha_final-$fecha;
  29.  
  30.    
  31.      if(round($tiempo / 31536000) <= 0){
  32.         if(round($tiempo / 2678400) <= 0){
  33.              if(round($tiempo / 86400) <= 0){
  34.                  if(round($tiempo / 3600) <= 0){
  35.                     if(round($tiempo / 60) <= 0){
  36.                         if($tiempo <= 60){
  37.                         $can = $tiempo;
  38.                         if($can == 1) {    $word = $lang['segundo']." "; } else {    $word = $lang['segundos']." "; }
  39.                         $hace = " " .$tiempo. " ".$word." ";
  40.                         }
  41.                     } else {
  42.                         $can = round($tiempo / 60);
  43.                         if($can <= 1) {    $word = $lang['minuto']." "; } else {    $word = $lang['minutos']." "; }
  44.                         $hace = " " .$can. " ".$word." ";  
  45.                     }
  46.                 } else {
  47.                     $can = round($tiempo / 3600);
  48.                     if($can <= 1) {    $word = $lang['hora']." "; } else {    $word = $lang['horas']." "; }
  49.                     $hace = " ".$lang['aproximadamente']." " .$can. " ".$word;
  50.                 }
  51.             } else {
  52.                 $can = round($tiempo / 86400);
  53.                 if($can <= 1) {    $word = $lang['dia']." "; } else {    $word = $lang['dias']." "; }
  54.                 $hace = "  ".$lang['aproximadamente']." " .$can. " ".$word." ";
  55.             }
  56.         } else {
  57.             $can = round($tiempo / 2678400);  
  58.             if($can <= 1) {    $word = $lang['mes']." "; } else { $word = $lang['meses']." "; }
  59.             $hace = "  ".$lang['aproximadamente']." " .$can. " ".$word;
  60.         }
  61.     } else {
  62.         $can = round($tiempo / 31536000);
  63.         if($can <= 1) {    $word = $lang['ano']." ";} else { $word = $lang['anos']." "; }
  64.         $hace = "  ".$lang['aproximadamente']." " .$can. " ".$word;
  65.     }
  66.     // Mensaje
  67.     return $hace;
  68. }

Solo hay que restarle el desfase a ambas fechas y te saca cuantos minutos, segundos y horas...
  #9 (permalink)  
Antiguo 04/03/2011, 21:53
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

Por cierto, para detectar la fase horaria usé JS, despues la marco en un select, y cuando guarda la guardo en la base de datos, asi pre-marca en el select la fase horaria de primeras...

JS del auto detect... JQUERY
Código Javascript:
Ver original
  1. // Esta funcion saca la zona horaria oficial del usuario
  2. function timezoneDetect(){
  3.     var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
  4.     var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
  5.     var intMonth;
  6.     var intHoursUtc;
  7.     var intHours;
  8.     var intDaysMultiplyBy;
  9.  
  10.     //go through each month to find the lowest offset to account for DST
  11.     for (intMonth=0;intMonth < 12;intMonth++){
  12.         //go to the next month
  13.         dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);
  14.  
  15.         //To ignore daylight saving time look for the lowest offset.
  16.         //Since, during DST, the clock moves forward, it'll be a bigger number.
  17.         if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
  18.             intOffset = (dtDate.getTimezoneOffset() * (-1));
  19.         }
  20.     }
  21.  
  22.     return intOffset * 60;
  23. }


php para el select
Código PHP:
Ver original
  1. $faseHoraria = array(
  2.                         '-43200' => '(GMT -12:00) Eniwetok, Kwajalein',
  3.                         '-39600' => '(GMT -11:00) Midway Island, Samoa',
  4.                         '-36000' => '(GMT -10:00) Hawaii',
  5.                         '-32400' => '(GMT -9:00) Alaska',
  6.                         '-28800' => '(GMT -8:00) Pacific Time (US & Canada)',
  7.                         '-25200' => '(GMT -7:00) Mountain Time (US & Canada)',
  8.                         '-21600' => '(GMT -6:00) Central Time (US & Canada), Mexico City',
  9.                         '-18000' => '(GMT -5:00) Eastern Time (US & Canada), Bogota, Lima',
  10.                         '-14000' => '(GMT -4:00) Atlantic Time (Canada), Caracas, La Paz',
  11.                         '-7200' => '(GMT -2:00) Mid-Atlantic',
  12.                         '-3600' => '(GMT -1:00) Azores, Cape Verde Islands',
  13.                         '0' => '(GMT 0) Western Europe Time, London, Lisbon, Casablanca',
  14.                         '3600' => '(GMT +1:00) Madrid, Paris, Berlin, Copenhagen',
  15.                         '7200' => '(GMT +2:00) Kaliningrad, South Africa',
  16.                         '10400' => '(GMT +3:00) Baghdad, Riyadh, Moscow, St. Petersburg',
  17.                         '12200' => '(GMT +3:30) Tehran',
  18.                         '14000' => '(GMT +4:00) Abu Dhabi, Muscat, Baku, Tbilisi',
  19.                         '16200' => '(GMT +4:30) Kabul',
  20.                         '18000' => '(GMT +5:00) Ekaterinburg, Islamabad, Karachi, Tashkent',
  21.                         '19800' => '(GMT +5:30) Bombay, Calcutta, Madras, New Delhi',
  22.                         '20700' => '(GMT +5:45) Kathmandu',
  23.                         '21600' => '(GMT +6:00) Almaty, Dhaka, Colombo',
  24.                         '25200' => '(GMT +7:00) Bangkok, Hanoi, Jakarta',
  25.                         '28800' => '(GMT +8:00) Beijing, Perth, Singapore, Hong Kong',
  26.                         '32400' => '(GMT +9:00) Tokyo, Seoul, Osaka, Sapporo, Yakutsk',
  27.                         '34200' => '(GMT +9:30) Adelaide, Darwin',
  28.                         '36000' => '(GMT +10:00) Eastern Australia, Guam, Vladivostok',
  29.                         '39600' => '(GMT +11:00) Magadan, Solomon Islands, New Caledonia',
  30.                         '43200' => '(GMT +12:00) Auckland, Wellington, Fiji, Kamchatka'
  31.                         );
  32.    
  33.  
  34.    
  35.     // Zona horaria
  36.     echo '<div class="inputTxt"><select name="zonaTxt" style="width:97%;">';
  37.     foreach($faseHoraria as $hora => $nombreFase){
  38.     echo '<option value="'.$hora.'" title="'.$nombreFase.'">'.$nombreFase.'</option>';
  39.     }
  40.     echo '</select></div>';


Pra el premarcado...
Código Javascript:
Ver original
  1. $("select[name='zonaTxt'] option[value='"+faseHoraria+"']").attr("selected","selected");



Incluso como sabes el desfase por js, lo mandas con AJAX y la guardas si quieres para desde el principio saber su fase horaria en el login de la aplicacion...
  #10 (permalink)  
Antiguo 04/03/2011, 21:56
 
Fecha de Ingreso: junio-2009
Mensajes: 309
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Calcular desfase horario segun la zona

El unico problema que le veo a esto es el hecho de que tiene que llamar a la funcion desfase a cada fecha que se quiera mostrar.... no es como aplicar la zona horaria del script al principio y luego trabajar... Por eso si con los segundos del desfase hay alguna forma de saber a que zona pertenece seria mejor para aplicarlo al principio del script...

Etiquetas: horario, zonas, calculadora
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:11.