Javascript: рассчитать количество дней в месяце за данный год
У меня есть HTML-страница с 3 раскрывающимися списками для месяца, дня и года, и мне было интересно, есть ли способ заполнить месяц, чтобы правильно упасть в зависимости от месяца и года.
Я не делал этого раньше на стороне клиента, но похоже, что многие элементы управления, такие как jQuery DatePicker, делают это за кулисами.
Ответы
Ответ 1
Вы можете играть с объектами даты:
var monthStart = new Date(year, month, 1);
var monthEnd = new Date(year, month + 1, 1);
var monthLength = (monthEnd - monthStart) / (1000 * 60 * 60 * 24)
Арифметика с объектами Date
дает несколько миллисекунд.
Это будет работать даже в декабре; конструктор Date обрабатывает аргументы вне диапазона, обертывая вокруг.
Обратите внимание, что month
основано на нуле (оно должно быть между 0
и 11
)
Ответ 2
Насколько я знаю, для этого нет (аккуратной) встроенной функции. Я написал это один раз:
// note that month is 0-based, like in the Date object. Adjust if necessary.
function getNumberOfDays(year, month) {
var isLeap = ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0));
return [31, (isLeap ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
}
Ответ 3
Date.prototype.daysinMonth: function(){
var d= new Date(this.getFullYear(), this.getMonth()+1, 0);
return d.getDate();
}
function daysinMonthfromInput(month,year){
return (new Date(year,month-1,1)).daysinMonth();
}
alert(daysinMonthfromInput(2,2011));
Ответ 4
Копировать из другого сообщения: Получить число дней в указанном месяце с помощью javascript?
//Month is 1 based
function daysInMonth(month,year) {
return new Date(year, month, 0).getDate();
}
//July
daysInMonth(7,2009); //31
//February
daysInMonth(2,2009); //28
daysInMonth(2,2008); //29
Все кредиты @c_harm, действительно отличное решение
Ответ 5
Здесь один лайнер.
Предполагая, что вы говорите, что январь = 1, февраль = 2 и т.д. (Будучи нормальным)
Здесь пример високосного года:
var y = 2012;
var m = 2;
var daysInMonth = new Date(y,m,1,-1).getDate();
Ответ 6
Я использую этот подход в своем текущем проекте и обнаружил, что мне нужно правильно исправить ошибки округления. Поэтому вместо использования monthLength в моем коде мне пришлось использовать это вместо:
monthLength.toFixed(0)
Например, если у меня есть объект, в котором я храню текстовое поле даты, он может выглядеть следующим образом:
obj.month = theMonths[mm - 1] + " " + monthLength.toFixed(0) + ", " + obj.year;
Ответ 7
Фактически вы можете использовать это:
var curdate = new Date();
DaysMonth = 32 - новая дата (curdate.getYear(), curdate.getMonth(), 32).getDate();
;)
Ответ 8
Date.prototype.daysinMonth= function(){
var d= new Date(this.getFullYear(), this.getMonth()+1, 0);
return d.getDate();
};
function daysinMonthfromInput (month, year) {
return (new Date(year, month - 1, 1)).daysinMonth();
};
function fillallday (elem, month, year) {
var options = null;
var elementExists = document.getElementById(elem);
if (elementExists != null) {
this.removeOptions(elementExists);
var opt = document.createElement('option');
opt.value = "";
opt.innerHTML = "---Day---";
elementExists.appendChild(opt);
if (month != "") {
if (typeof (year) === "undefined") {
year = new Date().getFullYear();
}
if (year == "") {
year = new Date().getFullYear();
}
var days = daysinMonthfromInput(month, year);
for (var i = 1; i <= days; i++) {
var opt = document.createElement('option');
opt.value = i;
opt.innerHTML = i;
elementExists.appendChild(opt);
}
}
}
}