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

Funcion para convertir fecha a la zona horaria del usuario

Necesito una funcion php o javascript (Preferiblemente PHP), para convertir una fecha en formato dd/mm/yyyy hh/mm/ss con zona horaria de Madrid a la zona horaria del usuario.

0voto

Leonardo-Tadei comentado

En qué formato tenés la zona usuaria del usuario?

0voto

Jaumesv comentado

Las fechas las tengo asi: "10/12/2013 a las 12:00"
En la zona horaria de madrid. Mediante php quitaria el "a las" para que quedara asi "dd/mm/yyyy hh:mm" para ya con la funcion convertirla a la zona horaria del usuario

0voto

Leonardo-Tadei comentado

Hola jaumesv,

jamás me lo hubiera imaginado ;-) La conversión de zona horaria es pasar la fecha y hora local a la del visitante. Por ejemplo, si vos estás en Madrid, que es creo UTC+1 y yo estoy en Mar del Plata, que es UTC-3, si la hora del sistema es por ejemplo las 15hs, yo debería ver las 11hs.

Pero si no entiendo mal, lo que vos querés hacer es solo cambiar el formato de visualización. Cuales son las reglas de este cambio de formato? Solo poner "a las" o no ponerlo si la zona horaria es Madrid? La fecha y hora que querés mostrar está almacenada o se genera en el momento con date() ???

0voto

Jaumesv comentado

Noo, yo me referia a lo que tu dices de cambiar la zona horaria de una fecha a la del usuario! He hecho una funcion pero tengo un pequeño problema y es que tengo esto en el config de mi web 'datedefaulttimezoneset("Europe/Berlin");'. 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'.
'function zonause($tiempo){
$date = $date('Y-m-d H:i:s');
$date2 =;
$resto = $date - $date2;
$palabras=explode("-",$resto);
$total=count($palabras);
if($total!=="1") {
$newresto = strreplace ("-", "", $resto);
}else{
$newresto = '-'.$resto;
}
$tiempo2 = strreplace ("a las", "", $tiempo);
$nuevafecha = strtotime ( $newresto.' hour' , strtotime ( $tiempo2 ) ) ;
$nuevafecha = date ( 'd/m/Y H:i:s' , $nuevafecha );
$nuevafecha = strreplace (" ", " a las ", $nuevafecha);
return "$nuevafecha"
}'.
La $date2 deberia ser la hora actual del usuario en su zona horaria, que es la que no se como hacerlo. El codigo por lo demas esta bien? Es que no he podido probarlo aun porque el servidor de mi web se cayó.

0voto

Peter comentado

Si ya tienes la solución para esta pregunta, puedes ponerla com respuesta nueva y seleccionarla. Saludos.

1 Respuesta

2votos

greuze Puntos360

Si quieres hacer cuentas con la zona horaria del usuario, tendrás que usar javascript (ya que el código PHP se ejecuta en el servidor, que puede estar en una zona horaria distinta).

Si tu fecha tiene un formato "estándar", podrás utilizar las funciones básicas de javascript Date.parse(...), pero en tu caso, el formato parece que no es estándar.

Para parsear la fecha "10/12/2013 a las 12:25:59", podrías usar:

var dateString = "10/12/2013 a las 12:25:59";
var reggie = /(\d{2})\/(\d{2})\/(\d{4}) a las (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[3]),
    (+dateArray[2])-1, // Los meses empiezan con 0!
    (+dateArray[1]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Si tu formato de fecha fuera, como pones en el enunciado, "dd/mm/yyyy hh/mm/ss", entonces tendrías que sustituir reggie por:

var reggie = /(\d{2})\/(\d{2})\/(\d{4}) (\d{2})\/(\d{2})\/(\d{2})/;

Con esto, estarías utilizando la zona horaria por defecto, si quieres ajustar los valores teniendo en cuenta la zona horaria, tendrías que hacer algo así:

var fechaFinal = new Date(dateObject.getTime() + (dateObject.getTimezoneOffset() + 60) * 60 * 1000);

Donde el 60 que se le suma al timezone offset es 60, porque son los minutos de diferencia entre CET y UTC (en verano será 120).

Para terminar te comento que creo que te estás complicando la vida con tanto parseo y formateo. Al trabajar con diferentes zonas horarias, es más práctico guardar siempre la hora UTC, que no depende de zonas horarias ni de verano/invierno, incluso puedes guardarlo en formato milisegundos, en lugar de fecha completa. Luego las conversiones son mucho más fáciles (si lo tuvieras en milisegundos, simplemente tendrías que hacer "new Date(dateEnMilis)" y ya tendrías la zona horaria del cliente.

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