夏令时【Daylight Saving Time】时间计算出错的解决办法

纠结了好几天,今天终于找到了解决办法,赶快分享一下:

在夏令时时区会出现的情况:

1、非夏令时:

夏令时【Daylight Saving Time】时间计算出错的解决办法_第1张图片

2、夏令时:

夏令时【Daylight Saving Time】时间计算出错的解决办法_第2张图片

3、Code:

夏令时【Daylight Saving Time】时间计算出错的解决办法_第3张图片

       同样是两个时间相减,为什么夏令时和非夏令时不一样的,这实际上就是夏令时的规则,大概在每年的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时间相减,这样得出来的结果就不会随着时区的改变而变化了。

        如果你有好的方法或者见解,欢迎与我讨论分享。


 

你可能感兴趣的:(js,time,夏令时,UTC,DST,saving,Daylight)