entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Problema con date_default_timezone_set en include

He creado una funcion para hallar las horas de diferencia de la zona horaria del usuario respecto a la de Berlin. Mi problema es que tengo un include con la configuracion de mi web y en ella tengo esto: 'datedefaulttimezoneset("Europe/Berlin");' que hace que todas las obtenciones de fecha las haga en esa zona horaria. Como puedo obtener la fecha y hora actual del usuario sin que me ponga la zona horaria de Berlin?
Aqui la funcion:

 function zonause($tiempo){
$tiempo2 = str_ireplace("a las", "", $tiempo);
$date = date("Y-m-d H:i:s");
$date2 =;
$resto = $date - $date2;
$palabras=explode("-",$resto);
$total=count($palabras);
if($total!=="1") {
$newresto = str_ireplace("-", "", $resto);
}else{
$newresto = '-'.$resto;
}
$nuevafecha = strtotime ( $newresto.' hour' , strtotime ( $tiempo2 ) ) ;
$nuevafecha = date ( 'm/d/Y H:i:s' , $nuevafecha );
$nuevafecha = str_ireplace(" ", " a las ", $nuevafecha);
return "$nuevafecha";
};
echo zonause('02/01/2014 a las 02:13');

La funcion obtiene la hora actual en Berlin y la de el usuario (Que no se como hacerlo), y hace el resto para averiguar cuantas horas se llevan de diferencia, luego quita el 'a las' de la fecha que se tiene que convertir y resta o suma las horas a la fecha y vuelve a a poner el 'a las'.
La $date2 deberia ser la hora actual del usuario en su zona horaria. El codigo por lo demas esta bien? Es que no he podido probarlo aun porque el servidor de mi web se cayó.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Jaumesv,

tu problema se reduce entonces a saber la hora del visitante... y no es un problema menor.

Para conseguir la hora del visitante, tenés que sí o sí recurrir a algún lenguaje que se ejecute del lado del cliente, como JavaScript, ya que desde el servidor no tendrás acceso a esta información.

Acá hay algunos enlaces al respecto:
http://www.forosdelweb.com/f13/saber-uso-horario-visitante-976335/
http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/

Ahora bien, una vez que tenés esto en JavaScript, se me ocurren dos alternativas:

una es que el servidor siempre entregue la hora en su uso horario, y que una función JavaScript haga la conversión antes de mostrarla. Es más simple de lo que parece porque en vez de mostrar por ejemplo:

<span><?php print($hora); ?></span>

lo que mostrás sería:

<span><?php print("<script>mostrarHora('$hora');</script>"); ?></span>

y la función JavaScript mostrarHora() se encargaría de hacer la conversión y de mostrarla en el span.

La otra opción sería leer la hora, enviarla en un formulario o vía AJAX al servidor, poner una variable de sesión con el uso horario, y luego cada vez que debas mostrar la hora, consultar la variable de sesión para saber que cambio hacer.

En esta opción es más simple guardar en la sesión la diferencia con UTC, así evitas enviar cada vez la hora local del visitanet.

Saludos!

0voto

Jaumesv comentado

Como puedo separar esto '02/01/2014 a las 02:13' en dia, mes,año,horas y minutos en javascript?
habia pensado hacerlo mediante indexOf(), seleccionando por exemplo los dos primeros para el dia pero al ser numeros no me deja y se cree que estoy buscandolos.

0voto

Leonardo-Tadei comentado

Podría ser algo así:

<!DOCTYPE html>
<html>
<head>
    <title>parser fecha</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <script type="text/javascript">
    function parserFecha(f){
        // Divido por los espacios
        t = f.split(' ');
        r = new Object;
        r.dia = t[0].substr(0,2);
        r.mes = t[0].substr(3,2);
        r.ano = t[0].substr(6,4);
        r.hora = t[3].substr(0,2);
        r.minutos = t[3].substr(3,2);
        return r;
    }
    function hacer(){
        res = parserFecha("02/01/2014 a las 02:13")
        document.getElementById("resultado").innerHTML =  res.dia+"/"+res.mes+"/"+res.ano+" "+res.hora+":"+res.minutos;
    }
    </script>
</head>
<body>
<input type="button" value="Procesar" onclick="javascript:hacer();" />
<div id="resultado">@</div>

</body>
</html>

En realidad, la función devuelve un objeto JS para que puedas mostrarla de cualquier manera (el día de mañana por ejemplo para EEUU en formato "M/d/Y H:i") pero el formato de salida es arbitrario tal vez te convenga más devolver dos strings, uno con la fecha y otro con la hora, para que sea más corto el código que lo rearma y muestra.

Otra opción podría ser pasar un segundo parámetro a la función que determine si se pasa con el "a las" o no, y que la función devuelva el string ya armado. Otra sería que se le pase como segundo parámetro el uso horario y que devuelva un string con las horas correspondientes sumadas o restadas... en fin, es cuestión de gustos. Lo importante del código es el parseo de la fecha.

Saludos!

0voto

Jaumesv comentado


0voto

Leonardo-Tadei comentado

Una de las soluciones posibles es sumar la diferencia horaria y pasarla como segundo parámetro de la función. Para la conversión, el propio objeto Date de JavaScript se encarga:

<!DOCTYPE html>
<html>
<head>
    <title>parser fecha</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <script type="text/javascript">
    function parserFecha(f, offset){
        // Divido por los espacios
        t = f.split(' ');
        r = new Object;
        r.dia = t[0].substr(0,2);
        r.mes = t[0].substr(3,2);
        r.ano = t[0].substr(6,4);
        r.hora = parseInt(t[3].substr(0,2));
        r.minutos = t[3].substr(3,2);
        // Convierte al timezone recibido
        d = new Date(r.ano, r.mes, r.dia, r.hora + offset, r.minutos);
        // reconstruye la fecha para devolver el valor
        r.dia = ("0" + d.getDate()).slice (-2); // Completa con ceros si hace falta
        r.mes = ("0" + d.getMonth()).slice (-2);// Completa con ceros si hace falta
        r.ano = d.getFullYear();
        r.hora = ("0" + d.getHours()).slice (-2);// Completa con ceros si hace falta
        r.minutos = d.getMinutes();
        return r;
    }   

    function hacer(){
        res = parserFecha("02/01/2014 a las 04:13", -6)
        document.getElementById("resultado").innerHTML =  res.dia+"/"+res.mes+"/"+res.ano+" "+res.hora+":"+res.minutos;
    }
    </script>
</head>
<body>
    <input type="button" value="Procesar" onclick="javascript:hacer();">
    <div id="resultado">@</div>
</body>
</html>

El offset es la diferencia horaria con tu hora local, es decir, con Berlín.

El código se peude escribir más compacto, pero bueno, así queda más claro y esto es para aprender.

0voto

Jaumesv comentado

Lo he hecho asi pero me convierte la hora mal, porque si le digo que quiero una hora me suma 5 dias y 7 horas mas!

<script>
    var diferenced = '1';
    function convert(data){
        t = data.split(' ');
        r = new Object;
        r.dia = t[0].substr(0,2);
        r.mes = t[0].substr(3,2);
        r.ano = t[0].substr(6,4);
        r.hora = t[3].substr(0,2);
        r.minutos = t[3].substr(3,2);
        d = new Date(r.ano, r.mes, r.dia, r.hora + diferenced, r.minutos);
        resdia = ("0" + d.getDate()).slice (-2); 
        resmes = ("0" + d.getMonth()).slice (-2);
        resano = d.getFullYear();
        reshora = ("0" + d.getHours()).slice (-2);
        resminutos = d.getMinutes();
        ret = resdia+"/"+resmes+"/"+resano+" a las "+reshora+":"+resminutos;
        document.write(ret);
    }     
    convert('02/01/2014 a las 14:13'); # Me dice que son las 07/01/2014 a las 21:13
</script>

0voto

Leonardo-Tadei comentado

Eso es porque resulta que el string "1" concatenado con el string "14" da el string "141"... que son las horas que se te está corriendo la fecha.

El fallo en tu script (el mío funciona bien ;-) ) es que definiste diferenced como string en vez de como entero:

var diferenced = 1;

y que al cargar el valor de la hora no lo convertís a entero con:

r.hora = parseInt(t[3].substr(0,2));

Saludos!

0voto

Jaumesv comentado

Aaa... Vale... Muchisimas Gracias!!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta