Javascript: рассчитать количество дней в месяце для данного года - PullRequest
11 голосов
/ 03 февраля 2011

У меня есть HTML-страница с 3 выпадающими списками для месяца, дня и года, и мне было интересно, есть ли способ правильно заполнить выпадающий список в зависимости от месяца и года.

У меня нетЯ делал это раньше на стороне клиента, но похоже, что многие элементы управления, такие как jQuery DatePicker, делают это за кулисами.

Ответы [ 8 ]

27 голосов
/ 03 февраля 2011

Насколько я знаю, для этого нет (аккуратной) встроенной функции.Я написал это однажды:

// 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];
}
18 голосов
/ 03 февраля 2011

Вы можете играть с объектами даты:

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)

3 голосов
/ 30 июня 2014

Копировать из другого поста: Получить число дней в указанном месяце, используя 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, действительно отличное решение

2 голосов
/ 03 февраля 2011
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));
1 голос
/ 09 августа 2013

Вот один лайнер. Предположим, вы говорите, что январь = 1, февраль = 2 и т. Д. (Нормально) Вот пример високосного года:

var y = 2012;
var m = 2;
var daysInMonth = new Date(y,m,1,-1).getDate();
0 голосов
/ 12 января 2016
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);
             }
         }
     }

 }
0 голосов
/ 18 марта 2015

Вы действительно можете использовать это:

var curdate = new Date (); DaysMonth = 32 - новая дата (curdate.getYear (), curdate.getMonth (), 32) .getDate ();

;)

0 голосов
/ 07 февраля 2014

Я использую этот подход в своем текущем проекте и обнаружил, что мне нужно исправить ошибки округления. Поэтому вместо использования monthLength в моем коде мне пришлось использовать это вместо:

monthLength.toFixed(0)

Например, если у меня есть объект, в котором я храню текстовое поле даты, он может выглядеть следующим образом:

obj.month = theMonths[mm - 1] + " " + monthLength.toFixed(0) + ", " + obj.year;
...