Я использовал подход, аналогичный , который использовал Джош Фрейзер , который определяет смещение времени браузера от UTC и определяет, распознает ли он летнее время или нет (но несколько упрощенно из его кода):
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's 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();
После загрузки выполняется функция ClientTZ.getBrowserTZ()
, которая устанавливает:
ClientTZ.UTCoffset
к смещению времени браузера от UTC в минутах (например, CST составляет -360 минут, что на -6,0 часа от UTC);
ClientTZ.UTCoffsetT
к смещению в форме '±hhmmD'
(например, '-0600D'
), где суффикс равен D
для летнего времени и S
для стандартного (не летнего времени);
ClientTZ.hasDST
(истина или ложь).
ClientTZ.UTCoffset
предоставляется в минутах, а не в часах, поскольку некоторые часовые пояса имеют дробные часовые смещения (например, +0415).
Цель ClientTZ.UTCoffsetT
- использовать его в качестве ключа в таблице часовых поясов (здесь не приводится), например, в раскрывающемся списке <select>
.