2011-06-24 44 views
2

這很奇怪我不知道我做錯了什麼。我有一個函數來獲取日期(即格式爲:06/24/2011),這裏的功能:setDate()在31日設置錯誤的日期?

function checkDate(input){ 
    var d = new Date(); 
    var dspl = input.split("/"); 

    if(dspl.length != 3) 
     return NaN; 

    d.setDate(dspl[1]); 

    d.setMonth(Number(dspl[0])-1); 

    if(dspl[2].length == 2) 
     d.setYear("20"+(dspl[2]+"")); 
    else if(dspl[2].length == 4) 
     d.setYear(dspl[2]); 
    else 
     return NaN; 

    var dt = jsToMsDate(new Date(d)); 
    return dt; 
} 

如果我進入這個月的任何一天,它會正確地解析日期,但如果我輸入31,即"01/31/2011",那麼它會變成"01/01/2011"。我不知道該怎麼做,也不確定問題出在哪裏。

+0

你是否檢查過最後的'新日期(d)'是否在做v.s.你的'jsToMsDate()'函數?可能是JS工作正常,但你的jsToMs函數壞了 –

+0

我試過了,仍然顯示第一個而不是第31個。 – Saxman

回答

9

JavaScript的Date對象允許您給出無效的月份和天數組合;他們會自動爲您修正這些問題(例如,如果您在6月份將月份的日期設置爲31,則會自動在7月1日)。這意味着,如果您單獨設置字段,您可能會遇到自動更正的方式。

在你的情況,如果你要設置所有這三個字段,你最好使用Date構造接受它們作爲參數傳遞的形式:

var dt = new Date(year, month, day); 

(如果你想時,分,秒和毫秒,您可以將其添加爲參數,以及)

所以看你的代碼,現成的,袖口更新:

function checkDate(input){ 
    var year, month, day, d, dt; 
    var dspl = input.split("/"); 

    if(dspl.length != 3) 
     return NaN; 

    year = parseInt(dspl[2], 10); 
    month = parseInt(dspl[0], 10) - 1; 
    day = parseInt(dspl[1], 10); 
    if (isNaN(year) || isNaN(month) || isNaN(day)) { 
     return NaN; 
    } 

    if (year < 100) { 
     year += 2000; 
    } 

    d = new Date(year, month, day); 

    var dt = jsToMsDate(d); 
    return dt; 
} 

有關此更新的其他注意事項:

  • 最好使用parseInt來解析最終用戶的號碼,並始終指定基數(小數點後10位)。 (不,parseInt不慢Number或一元+伎倆。人們以爲它是,但it isn't。)
  • 無需渣土約用繩子到2000年增加至僅使用兩個數字給出年。但如果你喜歡,你可以。注意我削弱了那裏的驗證,允許一個數字年(比如說)2001年和三個數字年(例如)300年。所以如果你需要它那麼強大,你需要重新調整。
  • 不需要再次將日期實例提供給new Date()
7

您需要設置月份之前設置日期(或如Marc B在他的評論中指出的,使用Date(yearval, monthval, dayval)構造函數)。

當您創建一個Date對象時,它默認爲當前日期。在寫作時間是在六月份,所以當你試圖將日期設置爲31時,它會包裝。

...並且由於閏年中類似的行爲,您應該在設置月份或日期之前設置年份。

(這是你在六月開發這個代碼,而不是在七月一份好工作 - 這個bug會潛藏着未被發現,直到九月,這很可能是你的用戶是發現它,而不是你:-)

+0

對不起,我編輯過我的代碼......'d.setDate(dspl [1] + 1);'是我經歷過的事情,看看我是否做錯了什麼。編輯我的代碼。 – Saxman

+0

@saxman:查看我更新的答案。 – RichieHindle

+2

另一種選擇是做'd = new Date(yearval,monthval,dayval)'而不是單獨執行'.set ...()'調用。在一次電話會議中解決這些包裝問題。 –

0

爲什麼你在日期位置(位置1)加1?我認爲這是你的問題。

d.setDate(dspl[1] + 1); 
0

正確的層次結構是設置年份,然後是月份,最後添加日期。 這將返回您添加的確切日期。

function checkDate() { 
 

 
    //Wrong order- will return 1 May 2016 
 
    var start = new Date(); 
 
    start.setDate(31); 
 
    start.setMonth(4); 
 
    start.setFullYear(2016); 
 
    alert(start) 
 

 

 
    //Right order - will return 31 May 2016 
 
    var end = new Date(); 
 
    end.setFullYear(2016); 
 
    end.setMonth(4); 
 
    end.setDate(31); 
 
    alert(end) 
 

 

 
}
<input type="button" value="Test" onclick="checkDate()" />

這是設置日期正確的層次結構。

相關問題