2010-07-29 60 views
8

¿Cómo puedo escribir una secuencia de comandos para detectar cuándo un usuario cambia la hora de su sistema en JS?Detección de cambios en la hora del sistema en JavaScript

+6

Whoa tienes algunos problemas serios si los usuarios cambian ** tu ** hora del sistema. – Pointy

+2

@Pointy: ese comentario tenía más sentido antes de mi edición: p –

+0

"their". por supuesto, gracias – AHOYAHOY

Respuesta

7

No hay una forma (portátil) de rastrear una variable en JavaScript. Además, la información de la fecha no está en el DOM, por lo que no tienes la posibilidad de que se desencadene un evento DOM.

Lo mejor que puede hacer es usar setInterval para verificar periódicamente (¿cada segundo?). Example:

function timeChanged(delta) { 
    // Whatever 
} 

setInterval(function timeChecker() { 
    var oldTime = timeChecker.oldTime || new Date(), 
     newTime = new Date(), 
     timeDiff = newTime - oldTime; 

    timeChecker.oldTime = newTime; 

    if (Math.abs(timeDiff) >= 5000) { // Five second leniency 
    timeChanged(timeDiff); 
    } 
}, 500); 
+0

Eso es exactamente. Gracias. Pero el cambio de hora atrás, nada sucede. – AHOYAHOY

+0

@yomash, esto puede ser un problema de Windows o Chrome; Noté que tardé un poco en propagar los cambios en el tiempo yo mismo. Sucede, sin embargo, pero solo unos segundos más tarde de lo que cabría esperar. – strager

+0

sí, problema de Chrome (en ubuntu). Gracias. – AHOYAHOY

0

¿Quiere decir si están cambiando su propio sistema de tiempo a algo que está mal? Puede preguntar al usuario su zona horaria y obtener la hora correcta del servidor, y luego compararla con la hora del sistema del usuario.

+0

Mi página ha generado eventos en el momento exacto. Cuando el usuario cambia la hora de su sistema, saltee varios eventos, por ejemplo. – AHOYAHOY

0

No creo que haya una solución a lo que está pidiendo, pero se puede hacer que los usuarios de zona horaria compensados.

new Date().getTimezoneOffset() * -1 

Esto devuelve el desplazamiento en minutos desde GMT. Sin embargo, ten en cuenta que esto no tiene en cuenta el horario de verano.

1

Comprobar en una función de intervalo que el tiempo no ha cambiado demasiado:

function getTime() { 
    var d = new Date(); 
    return d.getTime(); 
} 

function checkTime() { 
    if (Math.abs(getTime() - oldtime) > 2000) { // Changed by more than 2 seconds? 
    alert("You changed the time!"); 
    } 
    oldtime = getTime(); 
} 

var oldtime = getTime(); 
setInterval(checkTime, 1000); // Check every second that the time is not off 

probado en Windows con Opera & FF y funciona a la perfección.

+0

Malo, no leí el código con cuidado. – mattbasta

1
var last_time = new Date().getTime(); 
setInterval(function() { 
    var time = new Date().getTime(); 
    var offset = time - last_time; 
    if(offset < 0 || offset > 1500) { 
     // Time has been changed 
    } 
    last_time = time; 
}, 1000); 

En teoría, esto debería funcionar. Verificará cada segundo para asegurarse de que no haya cambiado la hora. Tenga en cuenta que utilizo 1100 milisegundos, ya que la mayoría de los intérpretes de JS no activan eventos exactamente en el momento especificado.

Espero que esto ayude!

0

Puede comprobar cada 30 segundos, etc. Si la nueva Hora está desactivada en más de 30 segundos +/- algún umbral, podría hacer una comparación más exhaustiva para determinar cuánto ha cambiado.

Cuestiones relacionadas