I used an approach similar to the one made by Josh Fraser , which determines the time offset of the browser from UTC and whether it recognizes DST or not (but is somewhat simplified from its code):
var ClientTZ = { UTCoffset: 0, // Browser time offset from UTC in minutes UTCoffsetT: '+0000S', // Browser time offset from UTC in '±hhmmD' form hasDST: false, // Browser time observes DST // Determine browser timezone and DST getBrowserTZ: function () { var self = ClientTZ; // Determine UTC time offset var now = new Date(); var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0); // Jan var diff1 = -date1.getTimezoneOffset(); self.UTCoffset = diff1; // Determine DST use var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0); // Jun var diff2 = -date2.getTimezoneOffset(); if (diff1 != diff2) { self.hasDST = true; if (diff1 - diff2 >= 0) self.UTCoffset = diff2; // East of GMT } // Convert UTC offset to ±hhmmD form diff2 = (diff1 < 0 ? -diff1 : diff1) / 60; var hr = Math.floor(diff2); var min = diff2 - hr; diff2 = hr * 100 + min * 60; self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S'); return self.UTCoffset; } }; // Onload ClientTZ.getBrowserTZ();
When loading, the ClientTZ.getBrowserTZ() function is ClientTZ.getBrowserTZ() , which sets:
ClientTZ.UTCoffset to the offset of the browser time from UTC in minutes (for example, CST is -360 minutes, which is -6.0 hours from UTC);ClientTZ.UTCoffsetT to the offset in the form of '±hhmmD' (for example, '-0600D' ), where the suffix is D for DST and S for standard (non-DST);ClientTZ.hasDST (true or false).
ClientTZ.UTCoffset provided in minutes instead of hours, because some time intervals have fractional hourly shifts (for example, +0415).
The purpose of ClientTZ.UTCoffsetT is to use it as a key in the time zone table (not specified here), for example, for the <select> drop-down list.
David R Tribble Apr 28 '16 at 18:59 2016-04-28 18:59
source share