yyyy year type formato fecha actual javascript firefox date

javascript - year - input type date value



Se necesita una soluciĆ³n para el error Firefox Date() (5)

Estoy trabajando en un gráfico de lienzo que se actualiza en tiempo real con la información que estamos mostrando a un cliente, y estábamos en el proceso de preparación para el cambio de horario de verano en los relojes. Uno de nuestros requisitos es que el gráfico siga funcionando como siempre, sin necesidad de que el cliente actualice la página cuando los relojes cambian.

Mientras trabajaba en este problema, descubrí este error con Firefox:

https://bugzilla.mozilla.org/show_bug.cgi?id=127246

Básicamente, el objeto Date () en JavaScript no se actualiza en Firefox si la hora del sistema se cambia sin tener que cerrar el navegador / pestaña, y como estamos consultando una API usando el reloj del sistema, este es un problema bastante importante.

Supongo que no es fijo ya que el ticket todavía está marcado como ''NUEVO'', y también estoy bastante seguro de que esto es lo que está causando el problema en lugar de otra parte de mi código, así que ¿cómo puedo obtener la hora actual del sistema? reloj después de que cambia en Firefox sin tener que actualizar la página?

FYI la versión de Firefox que estoy usando es 19.0.2

Gracias por adelantado

Ejemplo

Configure el reloj del sistema a las 12:00 y abra la aplicación web ...

var currentHour = new Date().getHours() //returns 12

Configure el reloj del sistema a las 13:00 sin volver a abrir la aplicación web.

var currentHour = new Date().getHours() //returns 12


Utilice Web Workers

En lugar de crear una nueva ventana como en la respuesta de Sergiu Toarca , cree un nuevo trabajador web cada vez que necesite una actualización. Firefox actualizaría el objeto Date() siempre que se genere un nuevo trabajador web.

function currDate() { var blob = new Blob([""]), blobURL = window.URL ? window.URL.createObjectURL(blob) : window.webkitURL.createObjectURL(blob), worker = new Worker(blobURL); worker.terminate(); return new Date(); }

Puede usarlo como un objeto Date() normal:

currDate().getHours(); // Gives you an updated hour

Ver DEMO (Funciona en Firefox 19).


Aquí hay una solución súper simple para la situación específica del PO, dado que las siguientes suposiciones que hice (basadas en lo que está escrito en su pregunta y comentarios) son correctas:

  • el gráfico es solo para un cliente
  • el gráfico se cargará principalmente en Firefox (versiones que tienen el mismo error de referencia)
  • la (s) máquina (s) del cliente están todas basadas en GMT (que se convierte en BST cuando cambian los relojes)
  • el (los) reloj (s) de la máquina son razonablemente precisos
  • el cliente no cambia los relojes de las máquinas sin querer.

Si lo anterior es cierto (posiblemente ni siquiera todos), esto se vuelve bastante simple. Como en realidad solo te preocupan dos zonas horarias, GMT y BST, puedes adaptar tu ejemplo de la siguiente manera:

Agregue este bit de código en el momento de la carga / inicialización del gráfico:

// given a date object, returns the actual hour (works for GMT/BST only) var getDisplayHour = (function() { var initiallyGMT = (new Date().toString().indexOf(''BST'') === -1); return function ( date ) { var isGMT = (date.toString().indexOf(''BST'') === -1); var offset = initiallyGMT - isGMT; return date.getHours() + offset; } })();

Configure el reloj del sistema a las 12:00 y abra la aplicación web ...

var currentDisplayHour = getDisplayHour( new Date() ); // returns 12

Configure el reloj del sistema a las 13:00 sin volver a abrir la aplicación web.

// the referenced bug keeps the same time, but it successfully changes the time zone, so: var currentDisplayHour = getDisplayHour( new Date() ); // returns 13

Probado en FF 19.0.0.2 en Mac y Windows 7.

Nota: Como no pude reproducir realmente el problema del OP, y teniendo en cuenta el caso de uso citado, ni siquiera estoy seguro de que sea necesario recurrir a ninguna de estas soluciones. Uno podría esperar una prueba más precisa para el caso de uso del OP que implique cambiar tanto el tiempo como la zona. Por ejemplo, no solo 12:00 -> 13:00, sino 12:00 GMT -> 13:00 BST. Una simulación aún más precisa del cambio de horario de verano sería establecer el reloj a 2013-03-31 00:59:00 GMT, verificar la new Date().getHours() , esperar un par de minutos y luego verificar la hora de nuevo.

Pero, como dije, no he podido reproducir el error citado por mí mismo, así que definitivamente podría estar equivocado (en cuyo caso corregiré o eliminaré esta respuesta).

Espero que esto ayude, de todos modos!


Como está hablando de actualizaciones en tiempo real del lienzo, supongo que está utilizando algún tipo de tecnología de inserción, como el uso de sockets web, o alguna tecnología de empuje falso, como el sondeo largo AJAX.

Sin embargo, como no puede confiar en el tiempo del lado del cliente de todos modos (como se mencionó en la otra respuesta), ¿por qué no simplemente utiliza sus paquetes de datos de inserción en tiempo real para incluir la hora actual?

De esta forma puedes matar dos pájaros de un tiro (lo siento por la expresión marcial, pero así es como dicen ;-)):

  • Usted tiene un reloj central en el que puede confiar: su servidor.
  • Hace uso de su infraestructura de actualización de datos existente y no necesita algo más en la parte superior.
  • Los clientes pueden configurar sus relojes a lo que quieran, siempre serán los datos correctos.

Todo lo que sus clientes deben hacer es obtener la zona horaria en la que se encuentran inicialmente, y luego sumar o restar la diferencia a la zona horaria que está siendo entregada por el servidor. Por ejemplo, si su cliente está en UTC + 1 y su servidor es UTC + 4, simplemente resta 3 horas de cada marca de tiempo que entrega su servidor.

Como los cambios de horario de verano solo aparecen dos veces al año, incluso puede codificarlo en su cliente y usar dos algoritmos de suma / resta diferentes. El que tenga que usar puede decidir dependiendo de la parte de la marca de tiempo que le envíe el servidor.

De esta forma, debería haber resuelto todos sus problemas, funciona en todos los navegadores y es independiente de las configuraciones de tiempo del cliente.

Espero que esto ayude :-)


Hay una solución alternativa simple (pero muy hacky) para este problema. Puede crear una nueva ventana (que por algún motivo restablece el caché de la ventana actual), obtener la fecha desde allí y luego cerrar inmediatamente la ventana.

var getRealDate = function() { var w = window.open(); var ret = new Date(); w.close(); return ret; };

Véalo trabajar en jsfiddle . Haga clic en el botón, luego cambie su zona horaria, luego haga clic en el botón nuevamente y obtendrá un valor actualizado.

Nota: solo probado en Firefox 19


Nunca se puede confiar en que el lado del cliente tenga configurada la fecha y hora correctas. La única solución que puedo pensar es solicitar la hora actual de otra fuente, por ejemplo, el servidor.

Si no quiere molestar a su propio servidor, puede encontrar una API pública que devuelva una marca de tiempo, como algún tipo de API de tiempo , o un servicio con tiempo de actividad confiable como la API de alertas de cliente de eBay, por ejemplo:

http://clientalerts.ebay.com/ws/ecasvc/ClientAlerts?callbackname=hello&callname=GetPublicAlerts

hello({"Timestamp":"2013-03-22T14:43:21.757Z","Ack":"Failure","Errors":[{"ShortMessage":"Missing required input element.","LongMessage":"Required input element is missing from the request.","ErrorCode":"1.19","SeverityCode":"Error","ErrorParameters":[{"Value":"ChannelDescriptor","ParamID":"0"}],"ErrorClassification":"RequestError"}],"Build":"E809_CORE_BUNDLED_15739296_R1","Version":"809"});

Ignora todo y obtén la marca de tiempo UTC. ¡Solo asegúrate de no estar criticando a un servidor por datos que realmente no necesitas!