需要Firefox Date()bug的解决方法

Tom*_*Tom 12 javascript firefox date

我正在制作一个画布图,它实时更新我们正在向客户展示的信息,并且正在准备时钟上的DST更改.我们的要求之一是图表能够照常运行,而不需要客户在时钟切换时刷新页面.

在解决这个问题时,我发现了Firefox的这个错误:

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

基本上,如果更改系统时间而不必关闭浏览器/选项卡,则JavaScript中的Date()对象不会更新,而且由于我们使用系统时钟查询API,这是一个非常重要的问题.

我假设它没有固定,因为票仍然标记为"新",我也很确定这是导致问题而不是我的代码的另一部分,所以我怎样才能得到系统的当前时间它在Firefox中更改后的时钟而不必刷新页面?

仅供参考我正在使用的Firefox版本是19.0.2

提前致谢

将系统时钟设置为12:00并打开Web应用程序...

var currentHour = new Date().getHours() //returns 12
Run Code Online (Sandbox Code Playgroud)

将系统时钟设置为13:00而无需重新打开Web应用程序.

var currentHour = new Date().getHours() //returns 12
Run Code Online (Sandbox Code Playgroud)

And*_*y E 9

无论如何,您都不能依赖客户端设置正确的日期/时间.我能想到的唯一解决方法是从其他来源请求当前时间,例如服务器.

如果您不想错误地使用自己的服务器,您可以找到一个返回时间戳的公共API,例如某种Time API,或者具有可靠正常运行时间的服务,例如eBay的Client Alerts API:

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"});
Run Code Online (Sandbox Code Playgroud)

忽略所有内容并获取UTC时间戳.只要确保你没有从一些服务器中掏出你真正不需要的数据!


Ant*_*ony 5

使用Web Workers

而不是像Sergiu Toarca的回答那样创建一个新窗口,而是在每次需要更新时创建一个新的Web工作者.Date()每当生成新的Web worker时,Firefox都会更新该对象.

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();
}
Run Code Online (Sandbox Code Playgroud)

您可以像普通Date()对象一样使用它:

currDate().getHours(); // Gives you an updated hour
Run Code Online (Sandbox Code Playgroud)

请参阅DEMO(适用于Firefox 19).