I have some js to get the local time displayed in uk's timezone.
var d = new Date(); // local system time (whatever timezone that is)
var dUK = new Date(d.toLocaleString('en-GB', { timeZone: 'Europe/London' })); // UK timezone (covers BST too)
Works fine in all browsers except IE 11(sigh...) which throws the following error:
Option value 'EUROPE/LONDON' for 'timeZone' is outside of valid range. Expected: ['UTC']
Does anybody have any suggestions? See http://jsbin.com/dawaqocuvi/1/edit?html,js,console,output for an example fiddle that supports IE.
IE11, has limited support of date formatting when using the timezone option, basically the only valid option is UTC. Not very useful.
Two options that I can think off.
Below is a snippet, that polyfill's the locale timezone, and creates a simple world time clock, with a few zones..
If your running a modern browser, you should be able to remove the script tag at the start and it will continue to work.
Update: Got this working now in IE11, case is important when doing the locale with the polyfill. eg.
Europe/Amsterdamis fine, buteurope/amsterdamis not, with Chrome it didn't seem to matter.
//var d = new Date(); var dUK = d.toLocaleString('en-GB', { timeZone: 'America/Chicago' }); console.log(dUK);
function updateTimes() {
var dt = new Date();
var els = document.querySelectorAll("[data-tz]");
for (var l = 0; l < els.length; l ++) {
var d = els[l];
d.innerText = dt.toLocaleString('en-GB', {timeZone: d.dataset.tz});
}
}
updateTimes();
setInterval(updateTimes, 1000);
<script src="https://unpkg.com/date-time-format-timezone@latest/build/browserified/date-time-format-timezone-complete-min.js"></script>
<p>Simple world time clocks</p>
<div><span data-tz="Europe/London"></span>
- London
</div>
<div>
<span data-tz="Europe/Amsterdam"></span>
- Amsterdam
</div>
<div>
<span data-tz="America/Chicago"></span>
- Chicago
</div>
Yes, as stated above, IE 11 supports most of the Intl API but does not support the use of a specific timeZone: http://kangax.github.io/compat-table/esintl/#test-DateTimeFormat_accepts_IANA_timezone_names
Here is an example of how to polyfill just the Intl.DateTimeFormat function's timeZone support using webpack's require.ensure:
const fillIntlDateTimeFormatTimezone = () => new Promise((resolve) => {
try {
new Intl.DateTimeFormat('en', {
timeZone: 'America/Los_Angeles',
timeZoneName: 'long'
}).format();
return resolve();
} catch (error) {
require.ensure(['date-time-format-timezone'], (require) => {
require('date-time-format-timezone');
return resolve();
}, 'DateTimeFormatTimezone');
}
});
This should only load the polyfill for browsers that don't support specifying a timeZone property which should only be IE 11 at this point.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With