Javascript闰年日期验证

时间:2016-08-09 10:31:46

标签: javascript

我尝试在现有的stackoverflow答案中搜索解决方案,但我找不到合适的答案......

我有3个地方..

  • select
  • select
  • 日期select

如果选择闰年,则2月份日期将更改为29天..但仍显示28天..不知道我的代码中有什么问题。

var numDays = {
        '1': 31, '2': 28, '3': 31, '4': 30, '5': 31, '6': 30,
        '7': 31, '8': 31, '9': 30, '10': 31, '11': 30, '12': 31
    };

    function setDays(oMonthSel, oDaysSel, oYearSel)
    {
        var nDays, oDaysSelLgth, opt, i = 1;
        nDays = numDays[oMonthSel[oMonthSel.selectedIndex].value];
        if (nDays == 28 && oYearSel[oYearSel.selectedIndex].value % 4 == 0)
            ++nDays;
        oDaysSelLgth = oDaysSel.length;
        if (nDays != oDaysSelLgth)
        {
            if (nDays < oDaysSelLgth)
                oDaysSel.length = nDays;
            else
                for (i; i < nDays - oDaysSelLgth + 1; i++)
                {
                    opt = new Option(oDaysSelLgth + i, oDaysSelLgth + i);
                    oDaysSel.options[oDaysSel.length] = opt;
                }
        }
        var oForm = oMonthSel.form;
        var month = oMonthSel.options[oMonthSel.selectedIndex].value;
        var day = oDaysSel.options[oDaysSel.selectedIndex].value;
        var year = oYearSel.options[oYearSel.selectedIndex].value;
        oForm.dob.value = month + '/' + day + '/' + year;
    }
    var min = new Date().getFullYear(),
            max = min - 13,
            select = document.getElementById('year');
    for (var i = (min - 100); i <= max; i++) {
        var opt = document.createElement('option');
        opt.value = i;
        opt.innerHTML = i;
        select.appendChild(opt);
    }
    date = document.getElementById('day');
    for (var i = 1; i <= 31; i++) {
        var opt = document.createElement('option');
        opt.value = i;
        opt.innerHTML = i;
        date.appendChild(opt);
    }
    jQuery('.month_sel,.day_sel,.year_sel').selectpicker({
        size: 8
    });

<select class="year_sel common_sel" name="year" id="year" onchange="setDays(month, day, this)">
<option value="">Year</option>
</select>
<select name="month" id="month" onchange="setDays(this, day,year)" class="month_sel common_sel">
<option value="">Month</option>
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select class="day_sel common_sel" name="day" id="day" onchange="setDays(month, this, year)">
<option value="">Day</option>
</select>
<input type="hidden" name="dob" value="" />

4 个答案:

答案 0 :(得分:2)

这一点错了:

if (nDays == 28 && oYearSel[oYearSel.selectedIndex].value % 4 == 0)
    ++nDays;

这是more complex than that。规则是:如果年份可被4 整除,则可被100整除,或者 可被400整除这是闰年。

所以

if (nDays == 28) {
    var year = oYearSel[oYearSel.selectedIndex].value;
    if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
        nDays = 29;
    }
}

例如,2000年是闰年;这是不寻常的,几个世纪以来75%的时间都不是(1900年不是,也不是2100年)。

答案 1 :(得分:2)

您可以使用JavaScript的内置Date对象。只需将它设置为给定年份的2月29日。然后检查它是否实际设置为2月(闰年),或者它是否延伸到3月(不是闰年)。

var year = (new Date()).getFullYear();
new Date(year + "-02-29").getMonth() === 1;

答案 2 :(得分:0)

这将为Date对象添加一个新方法:

    Date.prototype.isLeapYear = function() {
      if (0 == this.getFullYear() % 400) return true;
      if (0 == this.getFullYear() % 100) return false;
      return (0 == this.getFullYear() % 4) ? true : false;
    }

我已经使用了多年,它有效!

在代码中的某个位置添加脚本,然后从要检查的日期调用它:

    var dtTest = new Date();
    alert(dtTest + " Is leapyear = " + dtTest.isLeapYear());

或构建一个测试日期:

    var dtTest = new Date(2016,8,9);
    alert(dtTest + " Is leapyear = " + dtTest.isLeapYear());

答案 3 :(得分:0)

您可以使用日期对象并计算一个月的最终日期并进行相应处理:

示例

function getDaysInMonth(year, month){
  return new Date(year, month+1, 0).getDate();
}

console.log(getDaysInMonth(2016,1));
console.log(getDaysInMonth(2010,1));
console.log(getDaysInMonth(2000,1));
console.log(getDaysInMonth(2100,1));