原來一直以為Date.parse('2015/07/29')返回的是從1970.01.01到已知的那個時間的毫秒數(shù),順勢的以為,這是從1970.01.01的0:00開始計算的,但今天在解決一個問題時發(fā)現(xiàn)了異常,順便說一下這個“引發(fā)血案”的問題吧!
問題描述
計算從“20020504”到“20150825”共有所少天。(就是給定兩個八位串表示的日期,計算這之間的天數(shù)。)
解決過程
顯然,這需要考慮許多因素,什么閏年啊、每個月都有多少天啊等等。當(dāng)我還在糾結(jié)該怎么劃分不同情況時,我突然想到JS中有一個可以計算已知時間到1970.01.01的毫秒數(shù)(瞬間嗨起來呀,if,else什么的通通給我滾開。。。)。分別計算出這兩個日期相對于1970.01.01的毫秒數(shù)做差,再除以一天的毫秒數(shù)問題不就解決了,我就開始寫啊寫,好了,到了除以一天的毫秒數(shù)了,那么問題來了,一天有多少毫秒呢?一不做二不休,直接Date.parse("1970/01/02")不就結(jié)了。就在我還在感嘆我的高智商的時候,有一個叫“坑”的家伙來找我了。。。

What?結(jié)果怎么不對呢。。后來驚奇的發(fā)現(xiàn)問題竟然出現(xiàn)在Date.parse("1970/01/02")這行代碼上,結(jié)果竟然是-28800000,當(dāng)時的第一反應(yīng)就是難道他不是按照0:00來開始計算的?偷偷的換算了一下,居然等于-8小時,也就是說如果按照我的猜想,那么它應(yīng)該是從8:00開始計算的。what are you弄啥嘞?。∥易x書少,表騙我啊,腫么會這樣,后來在網(wǎng)上查了一下,發(fā)現(xiàn)了如下的解釋:
你沒有理解時間的計算機制。計算機系統(tǒng)里面的時間有兩個,一個叫做系統(tǒng)時間,一個叫做本地時間。
什么是系統(tǒng)時間?就是跟那個什么子午線的地方一致的時間,計算機如果運行正常的話,世界上所有的計算機的系統(tǒng)時間都應(yīng)該是相同的。但是問題來了,我們有一個時區(qū)的概念,雖然所有的計算機的系統(tǒng)時間相同,但是他們的本地時間不一樣,比如在那個子午線上的時間是1970-01-01 00:00:00的系統(tǒng)時間的時候,他的本地時間也是1970-01-01 00:00:00。但是在這個時候的中國,處在東八區(qū),它的本地時間比那個時間快八個小時,也就是1970-01-01 08:00:00。注意這只是本地時間不一致,這時候在中國的計算機的系統(tǒng)時間,仍然是1970-01-01 00:00:00。 現(xiàn)在你明白為什么了么?
明白了嗎?也就是說Date 的起點并非是固定不變的e,而是要加上當(dāng)前所在的時區(qū)哦!例如:北京時間的時區(qū)為東8區(qū),起點時間實際為:'1970/01/01 08:00:00'。
解決方案
最終得到了如下解決方案,長姿勢嘍。。。
<script>
function changeDate(str){
var result = "";
result += str.substring(0,4) + "/" + str.substring(4,6) + "/" + str.substring(6,8);
return result;
}
function countDays(date1, date2){
var res = 0,
d1 = changeDate(date1),
d2 = changeDate(date2),
//unit1 = Date.parse("01/01/1970"),這是出問題的地方哦!
unit = 24 * 60 * 60 * 1000;
res = Math.abs(Date.parse(d1) - Date.parse(d2));
res = res/unit;
return res;
}
var date1 = "20050731";
var date2 = "20050708";
console.log(countDays(date1,date2)+"天");
</script>
思考一下
今天本來是同學(xué)問我的這個問題,我本來是只想和他說說思路的,結(jié)果他非讓我寫出來,證明我是個合格的coder,那就寫唄(那就遇見了坑唄)。。感受很深啊,動手coding真的很重要啊,所以啊,以后遇到問題,可不能光靠說的,知識之間都是有關(guān)聯(lián)的,這不,中招了,coding著的是擴展自己知識的一個很好的方法啊??!