我們常有需要設定一個日期物件(Date),一般的做法是 new 出一個日期物件後,再把年、月、日設進去,如下所示:
var myDate = new Date();
myDate.setFullYear(2000); // 2000 年
myDate.setMonth(5); // 六月
myDate.setDate(30); // 30 日
以上的範例看起來沒問題,在平常執行的時候看似也正常,但是在某些情況下設定後的日期卻不是你想要的日期。情況如下:
情景一:
今天日期:2007/8/31
要設定的日期:2000/6/30
var myDate = new Date(); // 建立日期物件,此時日期物件中的日期為 2007/8/31
myDate.setFullYear(2000); // 設定年份,此時日期物件中的日期為 2000/8/31
myDate.setMonth(5); // 設定月份,此時日期物件中的日期為 2000/7/1
myDate.setDate(30); // 設定日,此時日期物件中的日期為 2000/7/30
為什麼原本設定 2007/6/30 會變成 2007/7/30,整整差了一個月?原因就出現在今天的日期。
當今天的日期為大月的最後一天,而要設定的日期是小月時就會發生這種情形。
回頭來看上面的情況,當程式執行到設定月份的時候,日期為 2000/6/31,由於6月沒有31日,日期物件會自動進位變成 2000/7/1,此時再設定日期就會變成2000/7/30,整整差了一個月!!
那好吧~ 我們先設日再設月應該能解決這樣的情況吧?如果這樣做的話一樣會有隱藏的錯誤,如以下的情況:
情景二:
今天日期:2007/9/30
要設定的日期:2000/8/31
var myDate = new Date(); // 建立日期物件,此時日期物件中的日期為 2007/9/30
myDate.setFullYear(2000); // 設定年份,此時日期物件中的日期為 2000/9/30
myDate.setDate(31); // 設定日,此時日期物件中的日期為 2000/10/1
myDate.setMonth(7); // 設定月份,此時日期物件中的日期為 2000/9/1
這次是月份對了,但日期卻不對!!
原因在於當今天的日期為小月的最後一天,而要設定的日期是大月的最後一天時就會發生這種情形。
回頭來看情景二的例子,當程式執行到設定日期的時候,日期為 2000/9/31,由於9月沒有31日,所以日期物件會自動進位成2007/10/1,如此一來日期就完全不對了!
解決的方法有兩種:
解決方法一:先將日期設成1月1日
今天日期:2007/8/31
var myDate = new Date();
myDate.setFullYear(2000); // 2000 年 --> 2000/8/31
myDate.setMonth(0); // 一月 --> 2000/1/31
myDate.setDate(1); // 1 日 --> 2000/1/1
myDate.setMonth(5); // 六月 --> 2000/6/1
myDate.setDate(30); // 30 日 --> 2000/6/30
解決方法二:使用日期物件的建構子 (建議使用)
var myDate = new Date(2000,5,30);
- Nov 29 Thu 2007 19:53
日期大陷阱
close
全站熱搜
留言列表
發表留言