obtener mostrar hora formato fecha año actual javascript time

formato - mostrar hora actual en javascript



La hora actual es anterior al tiempo previamente guardado (4)

Mi suposición es que el tiempo siempre avanza, pero aparentemente algunas veces no sucede de esta manera.

Tengo el siguiente ejemplo:

var LOOP_MS = 100; var prevCall = +new Date(); setTimeout(function loop() { foobar(); setTimeout(loop, LOOP_MS); }, LOOP_MS); function foobar() { var now = +new Date(), diff = now - prevCall; // expected to be somewhere around LOOP_MS // do stuff console.log(diff); prevCall = now; }

Ahora, la mayoría de las veces funciona como se espera, y diff muestra un número cercano a 100. Por supuesto, en el escenario de la vida real esperaría que el número subiera, especialmente cuando la computadora del usuario está realizando una operación pesada.

Lo que no espero es ver un número negativo, y sin embargo sucede. ¿Como es posible? ¿Me estoy perdiendo de algo? Pensé que tal vez podría deberse a una zona horaria diferente, pero no es así. También lo veo en diferentes navegadores (Chrome, Firefox, Safari), y los valores de diff son bastante inconsistentes: cualquier valor entre -9 y -100 000.

Ocurre en aproximadamente el 0,025% de los casos en producción, por lo que no es un gran problema, pero me pregunto cómo puede suceder (incluso en teoría).

Creo que logré reproducirlo un par de veces localmente ejecutando el script en una VM lenta y emulando una alta carga de CPU, pero todavía no veo por qué la función mostraría un número negativo (es decir, now es anterior a prevCall ) .


1º. Tienes una ecuación inexacta que al menos dará -1 a +1 sobre una cotización de retraso incluso en temporizadores de IE altamente precisos. Entonces eso es normal.

2do. los temporizadores tienen una ejecución de baja prioridad e incluso la mínima interacción de la página del mouse del cliente puede arrojar su intervalo de unos pocos ms.

Todas las demás operaciones de sincronización, funciones y eventos, los pondrán (temporizadores) en alto y causarán una cantidad aún mayor de perturbación del intervalo dado.


En realidad, es bastante fácil hacer que esto suceda al cambiar el tiempo en su computadora.

Es difícil resolver este problema genéricamente, pero puede encontrar algo inteligente para un problema más específico. Por ejemplo, si muestra un reloj de cuenta atrás en su sitio web, entonces su servidor puede decir cuál es la hora de inicio GMT, qué piensa "ahora" y cuántos segundos quedan. Cuando las cosas "salen mal" *, puede pedirle a su servidor la misma información y, dada esa información, puede compararla con la hora local de la máquina. Básicamente, puede usar la hora del servidor como punto de referencia en lugar de la hora de la interfaz.

Ir mal * - Con esto quiero decir, el temporizador se vuelve negativo o ha pasado demasiado tiempo desde la última ejecución. Demasiado tiempo puede significar 20 segundos.


prevCall es una variable global con un nombre genérico. ¿Es posible que alguna otra función le escriba?


La mayoría de las computadoras están configuradas para usar servidores NTP para configurar el reloj del sistema.

Como el reloj del sistema está configurado la primera vez, normalmente permanecerá sincronizado sin necesidad de actualizaciones.

En ocasiones (raramente) por varias razones, el reloj del sistema puede estar fuera de sincronización.

Como el reloj del sistema no coincide con la hora del servidor NTP, se actualiza y puede ir hacia atrás.

Los servicios NTP se configuran (normalmente) para evitar que el reloj retroceda: si el "espacio" es lo suficientemente pequeño, el daemon NTP intenta "ralentizar" el reloj del sistema hasta que esté nuevamente en sysnc. Pero como acabo de decir, esto depende de la configuración y del tamaño del espacio de tiempo.

Creo que todo lo anterior causa en casos raros el problema que estás viendo.

Puede encontrar esto interesante: ¿Hay alguna manera de garantizar que el reloj sincronizado ntp nunca se mueva hacia atrás?

Si está en macOS, puede intentar abrir la consola y buscar ntpd .

En mi máquina (un MBP con 10.9.5) veo un par de líneas como esta ...

Apr 2 01:11:40 mac-di-paolo.local ntpd[46]: ntpd: wake time set -1.848017 s

... que registra un ajuste del reloj del sistema.