jQuery的.ASP.NET MVC 3. Datepicker错误?

nte*_*dka 5 jquery jquery-ui

我的问题是.为什么只有在8月和9月选择CheckIn_Date时才会出现这个错误?

我有一个项目使用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())
    }
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

<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>
Run Code Online (Sandbox Code Playgroud)

Ama*_*ure 3

问题出在这个世界上。当您在thisDate.setFullYear(parseInt(s[0]), parseInt(s[1]) - 1, parseInt(s[2]));函数中将日期指定为 2010-08-01 时,parseInt(s[1])运行时看起来像这样parseInt("08"),但这里出错了

parseInt("08")返回Zero ,与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));
Run Code Online (Sandbox Code Playgroud)

这对你有用。