我使用以下代码片段来确定与操作系统报告的时区相关的不同值。
var oldOffset;
var dstBegin;
var dstEnd;
var dstDuration;
var inDayLightTimeFlag;
var useDayLightTimeFlag;
var arr = [];
var d = new Date();
d.setHours(12,0,0,0);
var currOffset = d.getTimezoneOffset();
var daysInYear = 365;
for(var i=1; i<=daysInYear; i++){
d = new Date();
//Defaulting time to 12:00PM each day as DST should have already been observed/no longer observed by that time
d.setHours(12,0,0,0);
d.setDate(i);
var newOffset = d.getTimezoneOffset();
if(i !== 1 && newOffset != oldOffset){
if(newOffset < oldOffset){
dstBegin = i;
} else if(newOffset > oldOffset) {
dstEnd = i;
}
}
arr.push(newOffset);
oldOffset = d.getTimezoneOffset();
}
var DST = Math.min.apply(null,arr);
var nonDST = Math.max.apply(null,arr);
console.log("IN DST Flag: " + inDayLightTimeFlag);
console.log("USE DST Flag: " + useDayLightTimeFlag);
console.log("Duration: " + dstDuration);
console.log("Begin: " + dstBegin);
console.log("End: " + dstEnd);
我在堆栈溢出的另一篇文章中得到了这段代码,它工作了一段时间。但是现在我看到了喜忧参半的结果。它在Chrome,IE和Edge中可以正常工作,但在某些情况下在Firefox中则不能。
在遇到问题的情况下,我将计算机时区设置为美国/中央(我在Windows 10上),并且未选中夏令时复选框。
在Chrome / IE / Edge中,从以上代码返回的值是:
inDayLightTimeFlag:false
useDayLightTimeFlag:false
dstDuration:0
dstBegin:0
dstEnd:0
在这种情况下哪个是正确的结果。
但是在firefox中,我得到以下值:
inDayLightTimeFlag:false
useDayLightTimeFlag:true
dstDuration:60
dstBegin:69
dstEnd:307
这是错误的。我们在不同版本的firefox上进行了测试,它在62中可以正常工作,但问题始于63及更高版本。似乎是由于最近对Firefox的更改引起的:https://bugzilla.mozilla.org/show_bug.cgi?id=1346211
有什么想法吗?寻找一种使浏览器尽可能独立的方法,但似乎Firefox中的错误解决可能导致了更多问题。