纠结了好几天,今天终于找到了解决办法,赶快分享一下:
在夏令时时区会出现的情况:
1、非夏令时:
2、夏令时:
3、Code:
同样是两个时间相减,为什么夏令时和非夏令时不一样的,这实际上就是夏令时的规则,大概在每年的3月底,夏令时会自动将系统时钟跳快一小时,具体操作就是当时钟走到1:59时,下一刻是3:00;如果是夏令时改成非夏令时一般是在11月初,当时钟走到1:59时,下一刻是1:00。
上面我计算的两个时间实际上是穿过夏令时的,如果你仔细计算一下(181-180,95833333..)*24,结果正好是一小时,也就是夏令时导致计算的时候少了一小时,这个就是我程序出错的根本原因,那么找到原因了,下一步就是找解决方案。
4、解决方案:
/// <summary>
/// Fixed TimeZone issue: Transfer the sDate1 and sDate2 to UTC, then minus.
/// </summary>
this.dateDiff = function (sDate1, sDate2)
{
//var days = parseInt((sDate1 - sDate2) / 1000 / 60 / 60 / 24);
var d1 = Date.UTC(sDate1.getFullYear(), sDate1.getMonth(), sDate1.getDate(), sDate1.getHours(), sDate1.getMinutes(), sDate1.getSeconds(), sDate1.getMilliseconds());
var d2 = Date.UTC(sDate2.getFullYear(), sDate2.getMonth(), sDate2.getDate(), sDate2.getHours(), sDate2.getMinutes(), sDate2.getSeconds(), sDate2.getMilliseconds());
var days = (d1 - d2) / 1000 / 60 / 60 / 24;
return days;
}
做时间相减的时候,找到当前时间对应的UTC[也叫GMT,格林威治]时间,然后再用两个UTC时间相减,这样得出来的结果就不会随着时区的改变而变化了。
如果你有好的方法或者见解,欢迎与我讨论分享。