我尝试在现有的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="" />
答案 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));