2012-01-18 27 views
5

我的問題是。爲什麼只有在8月和9月選擇CheckIn_Date時纔會發生此錯誤?jQuery。 ASP.NET MVC 3.日期選擇器錯誤?

我有一個項目使用ASP.NET MVC 3和jQuery的日期選擇器。假設我有3個文本框,分別命名爲CheckIn_Date,CheckOut_Date(這兩個使用datepicker)和Days

當我設置Days = 3時,我選擇CheckIn_Date = 2012-01-01,我的CheckOut_Date會自動計算日期並將值設置爲2012-01-03。

一切如我所料,直到我在我的CheckIn_Date中選擇2012-08-01並設置Days = 3. 我的CheckOut_Date值不是2012-08-04而是2012-12-04。只有在8月和9月選擇我的CheckIn_Date時纔會發生這種情況。選擇其他月份會給我我的CheckOut_Date的期望。

這裏是我的代碼:

$("input[data-datepicker='true']").change(function() { 
    var id = $(this).attr("name"); 
    var days = parseInt($("#maxProgramDays").val()); 
    //var o = new Date(); 
    var val = $(this).val(); 
    var s = val.split("-"); 
    var x = []; 
    var thisDate = new Date(); 
    thisDate.setFullYear(parseInt(s[0]), parseInt(s[1]) - 1, parseInt(s[2])); 

    //alert(thisDate.toDateString()) 
    if (id == "Reservation[0].CheckIn_Date") { 
     thisDate.setDate(thisDate.getDate() + days); 

     x['year'] = thisDate.getFullYear(); 
     x['month'] = m2d(thisDate.getMonth() + 1); 
     x['day'] = m2d(thisDate.getDate()); 

     $("input[name='Reservation[0].CheckOut_Date']").val(x['year'] + '-' + x['month'] + '-' + x['day']); 

     //alert(thisDate.toDateString()) 
    } 

    if (id == "Reservation[0].CheckOut_Date") { 
     thisDate.setDate(thisDate.getDate() - days); 

     x['year'] = thisDate.getFullYear(); 
     x['month'] = m2d(thisDate.getMonth() + 1); 
     x['day'] = m2d(thisDate.getDate()); 

     $("input[name='Reservation[0].CheckIn_Date']").val(x['year'] + '-' + x['month'] + '-' + x['day']); 

     //alert(thisDate.toDateString()) 
    } 

這是我的觀點:

<div class="display-label">Program Days</div> 
<div class="display-field"><span id="pDays"></span></div> 

<div class="editor-label">@Html.LabelFor(model => model.Reservation[0].CheckIn_Date)</div> 
<div class="editor-field reserveDate"> 
    @Html.Datepicker("Reservation[0].CheckIn_Date", "") 
    @Html.ValidationMessageFor(model => model.Reservation[0].CheckIn_Date) 
</div> 

<div class="editor-label">@Html.LabelFor(model => model.Reservation[0].CheckOut_Date)</div> 
<div class="editor-field reserveDate"> 
    @Html.Datepicker("Reservation[0].CheckOut_Date", "") 
    @Html.ValidationMessageFor(model => model.Reservation[0].CheckOut_Date) 
</div> 
+0

什麼是'm2d'?它是一個自定義的JavaScript函數嗎?發佈代碼。 – 2012-01-18 08:49:53

+0

對於遲迴復感到抱歉,是m2d是這樣的函數:m2d(m){var x;如果(parseInt(m)<10){ x ='0'+ m;其他{ x = m; } return x; } – 2012-01-20 01:43:29

+0

+1問題,發現有趣的解決方案。 – 2012-01-20 06:08:20

回答

3

的問題是這個世界的。這裏有雲時,你給日期2010-08-01,在你thisDate.setFullYear(parseInt(s[0]), parseInt(s[1]) - 1, parseInt(s[2]));功能,parseInt(s[1])在運行時的樣子喜歡parseInt("08"),這裏它出錯

parseInt函數(「08」)回報,它是同樣爲parseInt函數( 「09」)

原因

parseInt('08')和parseInt('09')都返回零,因爲該函數試圖確定所使用的數字系統的正確基數。在JavaScript中,從零開始的數字被認爲是八進制數,八進制數沒有08或09,因此存在問題。

如何修復

爲了解決這個問題只需添加第二個參數parseInt函數,用於轉換的基礎。正確的呼叫應該是parseInt(「08」,10)parseInt(「09」,10)

所以,你的代碼將成爲

thisDate.setFullYear(parseInt(s[0], 10), parseInt(s[1], 10) - 1, parseInt(s[2], 10)); 

這會爲你工作。