程式怎麼寫 - javascript的setMonth有問題??!!

程式怎麼寫 - javascript的setMonth有問題??!!

昨天. 8月31日,
朋友msn過來了一個javascript的問題,
說他的setMonth結果不對,
說他要設定為九月,
所以在setMonth後面的參加使用(9-1)
結果卻是顯示10月!
但是將參數改為(9-2)卻又顯示為8月.
而且直接將參數改為8,也是一樣顯示10月...

因為他需要使用將950906的字串轉成時間格式並顯示是星期幾,
所以他寫了下面這樣的function
var t = "950906"
dayArr = new Array("日","一", "二","三","四","五","六");
var todayDate = new Date();
todayDate.setFullYear(eval(t.substr(0,2))+1911);
todayDate.setMonth(eval(t.substr(2,2))-1);
todayDate.setDate(eval(t.substr(4,2)));
var myDay = dayArr[todayDate.getDay()];
document.write(todayDate + " = " + myDay + "<br>");

乍看之下...沒有蠻正常的...
而且在八月中的時候都是正常的.
但是到了昨天卻出錯...
一樣是"950906",但結果卻是出現"Fri Oct 06 2006 11:33:15 GMT+0800 = 五"

經過一番測試才發現,
因為當時的日期是31日,
所以用了setMonth(8)後,等於將時間設為9月的31日,因為九月只有30天,因此會將時間變成10月1日...
所以執行完setMonth後,時間就變成10月1日,
然後再setDate的話,那當然就變成了10月6日...
所以後來想說那將setDate跟setMonth的順序改一下應該就可以了,

var t = "950906"
dayArr = new Array("日","一", "二","三","四","五","六");
var todayDate = new Date();
todayDate.setFullYear(eval(t.substr(0,2))+1911);
todayDate.setDate(eval(t.substr(4,2)));
todayDate.setMonth(eval(t.substr(2,2))-1);

var myDay = dayArr[todayDate.getDay()];
document.write(todayDate + " = " + myDay + "<br>");

改了後,果然"950906"可以取到正確的日期了,
不過後來想一想...不對.那這樣的話,在二月或是在月分只有30天時候,要取月份有31天的第31天不就也是會出錯...
所以,最後就將程式改成如下...

var t = "950906"
dayArr = new Array("日","一", "二","三","四","五","六");
var todayDate = new Date();
todayDate.setDate(1);
todayDate.setFullYear(eval(t.substr(0,2))+1911);
todayDate.setMonth(eval(t.substr(2,2))-1);
todayDate.setDate(eval(t.substr(4,2)));
var myDay = dayArr[todayDate.getDay()];
document.write(todayDate + " = " + myDay + "<br>");

在最原始的程式中,加了一段 todayDate.setDate(1);
不管是哪個月份,反正都先調回1號,然後再去設定月份,然後再設定日期!

不過,其實有更簡單的方法...
在new Date的時候就直接設定好日期就可以了

var t = "950906"
dayArr = new Array("日","一", "二","三","四","五","六");
var todayDate = new Date(eval(t.substr(0,2))+1911 ,eval(t.substr(2,2))-1 ,eval(t.substr(4,2)));
var myDay = dayArr[todayDate.getDay()];
document.write(todayDate + " = " + myDay + "<br>");

這樣就不用去管setMonth跟setDay的問題了...

這問題一開始一直都在死胡同打轉...
其實如果一開始不要將注意力一直放在setMonth是不是有Bug的話,
這問題應該是很早有可以找到其他解決方案了!!
不過,在寫程式時,很多時候,都會有這樣的情況...
如果當初沒花時間在研究舊程式到底是出什麼問題的話,
那也就不會知道setDate跟setMonth到底是怎麼怎麼運作,
也不會知道這不是Javascript的bug,而是程式邏輯的問題...

只是如果案子在趕的話,這樣是會拖延結案的時程的...
至於應該怎麼做...就看當時的情況而定了...