我們常有需要設定一個日期物件(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);

arrow
arrow
    全站熱搜

    大笨鳥 發表在 痞客邦 留言(0) 人氣()