2011-02-03 1 views
11

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

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

+1

Возможные Дубликат: [репопулирующих даты на некоторых коробках] (http://stackoverflow.com/questions/4822550/repopulating-dates-on-select-boxes) –

+0

Благодаря Box9! На самом деле это то, что я искал. – Abe

ответ

18

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

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)

+0

Это потрясающе .. он даже работает на високосные годы. Я пробовал 2/2012. благодаря! – Abe

+2

Я завернул его как 'var DaysInMonth = function (год, месяц) {/ * код SLAK здесь * /; return monthLength;}; 'и еще добавил метод прототипа в Date' Date.prototype.daysInMonth = function() {var mlen = DaysInMonth (this.getFullYear(), this.getMonth()); return mlen; }; 'поэтому я могу вызвать' (новый DateTime (2000, 1)).daysInMonth(); ' –

+0

Март 2014 года по какой-то причине возвращает 30.958333333333332. – o01

25

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

// 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]; 
} 
+1

Это круто, как вы можете включить тройное выражение внутри массива! хороший! – Abe

+1

Это должен быть ответ! Brilliant! – Johny

2
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

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

var y = 2012; 
var m = 2; 
var daysInMonth = new Date(y,m,1,-1).getDate(); 
0

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

monthLength.toFixed(0) 

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

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

Копирование с другого поста: Get number days in a specified month using 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, действительно отличное решение

0

Фактически вы можете использовать это:

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

;)

-2
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

Этот вопрос был дан правильно - что этот ответ добавляет, что исходного ответа нет? –

 Смежные вопросы

  • Нет связанных вопросов^_^