Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need workaround for Firefox Date() bug

I'm working on a canvas graph that's updated in real time with information we're displaying to a customer, and were in the process of preparing for the DST change on the clocks. One of our requirements is for the graph to carry on functioning as usual without the need for the customer to refresh the page when the clocks switch over.

While working on this problem, I found out about this bug with Firefox:

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

Basically the Date() object in JavaScript doesn't update in Firefox if the system time is changed without having to close the browser/tab, and as we're querying an API using the system clock, this is a pretty major problem.

I'm assuming it's not fixed as the ticket is still marked as 'NEW', and I'm also pretty sure it's this that's causing the problem rather than another part of my code, so how can i get the current time of the system clock after it changes in Firefox without having to refresh the page?

FYI the version of Firefox I'm using is 19.0.2

Thanks in advance

Example

Set system clock to 12:00 and open web app...

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

Set system clock to 13:00 without reopening web app..

var currentHour = new Date().getHours() //returns 12
like image 831
Tom Avatar asked Mar 22 '13 14:03

Tom


3 Answers

You can't ever rely on the client-side to have the correct date/time set anyway. The only workaround I can think of is to request the current time from another source, e.g. the server.

If you don't want to bug your own server you could find a public API that returns a timestamp, like some kind of Time API, or a service with reliable uptime such as eBay's Client Alerts API for instance:

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"});

Ignore everything and just get the UTC timestamp. Just make sure you're not bashing the hell out of some server for data you don't really need!

like image 154
Andy E Avatar answered Nov 11 '22 22:11

Andy E


Use Web Workers

Instead of creating a new window as in Sergiu Toarca's answer, create a new web worker every time you need an update. Firefox would update the Date() object whenever a new web worker is generated.

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();
}

You can use it like a normal Date() object:

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

See DEMO (Works on Firefox 19).

like image 40
Antony Avatar answered Nov 11 '22 22:11

Antony


There is a simple (but very hacky) workaround for this problem. You can create a new window (which for some reason resets the cache of the current window), get the date from there, and then immediately close the window.

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

See it work on jsfiddle. Click the button, then change your timezone, then click the button again, and you will get an updated value.

Note: Only tested in Firefox 19

like image 3
Sergiu Toarca Avatar answered Nov 11 '22 23:11

Sergiu Toarca