2011-02-03 16 views
11

Mam stronę HTML z 3 dropdowns na miesiąc, dzień i rok i zastanawiałem się, czy istnieje sposób, aby zaludnić spadek miesiąca właściwie w zależności od miesiąca i rok.Javascript: obliczyć liczbę dni w miesiącu dla danego roku

Nie robiłem tego wcześniej po stronie klienta, ale wygląda na to, że wiele elementów sterujących, takich jak jQuery DatePicker, robi to za kulisami.

+1

Możliwy duplikat: [zasiedlać daty na wybranych polach] (http://stackoverflow.com/questions/4822550/repopulating-dates-on-select-boxes) –

+0

Dzięki Box9! Właśnie tego szukałem. – Abe

Odpowiedz

18

Można grać z datą obiektów:

var monthStart = new Date(year, month, 1); 
var monthEnd = new Date(year, month + 1, 1); 
var monthLength = (monthEnd - monthStart)/(1000 * 60 * 60 * 24) 

arytmetyczne z Date obiektów daje liczbę milisekund.

To zadziała nawet w grudniu; Konstruktor Date obsługuje argumenty poza zakresem poprzez zawijanie dookoła.

Zauważ, że month jest od zera (musi być między 0 i 11)

+0

To jest niesamowite ... działa nawet w latach przestępnych. Próbowałem 2/2012. dzięki! – Abe

+2

Zawinęłam go jako 'var DaysInMonth = function (rok, miesiąc) {/ * SLAK's code here * /; return monthLength;}; 'i dalej dodaje prototypową metodę Date" Date.prototype.daysInMonth = function() {var mlen = DaysInMonth (this.getFullYear(), this.getMonth()); return mlen; }; ', więc mogę wywołać' (new DateTime (2000, 1)).daysInMonth(); ' –

+0

Marzec 2014 zwraca 30.958333333333332 z jakiegoś powodu. – o01

25

Z tego co wiem, nie ma (schludnej) wbudowanej funkcji do tego. Pisałem to kiedyś:

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

To fajne, jak możesz dołączyć trójprzewodnikową instrukcję do tablicy! miły! – Abe

+1

To powinna być odpowiedź! Znakomity! – 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

Oto jeden liner. Zakładając mówisz styczeń = 1, luty = 2 itd .. (normalne) Oto lat przykład skok:

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

Używam tego podejścia w moim obecnym projekcie i okazało się, że potrzebne poprawne dla rundzie wyłączyć błędy. Więc zamiast korzystania monthLength w moim kodu, musiałem użyć zamiast tego:

monthLength.toFixed(0) 

Na przykład jeśli mam obiektu, w którym jestem przechowywania pole daty tekst może wyglądać następująco:

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

skopiować z innego wątku: 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 

Wszystkie kredyty do @c_harm, naprawdę świetne rozwiązanie

0

Możesz faktycznie użyć tego:

var curdate = new Date(); DaysMonth = 32 - nowa data (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

To pytanie zostało już odebrane poprawnie - co ta odpowiedź dodaje, że oryginalna odpowiedź nie ma odpowiedzi? –