Search code examples
javascriptdatetimeinternet-explorerlocalizationinternet-explorer-11

IE 11 throwing "'timeZone' is outside of valid range" when setting timezone to "Europe/London"


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.


Solution

  • 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.

    1. Use momentjs, this is a nice datetime lib, but might be overkill
    2. Use a pollyfill

    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/Amsterdam is fine, but europe/amsterdam is 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>