2008-11-24 7 views

Antwort

149

function daysInMonth (month, year) { // Use 1 for January, 2 for February, etc. 
 
    return new Date(year, month, 0).getDate(); 
 
} 
 

 
console.log(daysInMonth(2, 1999)); // February in a non-leap year. 
 
console.log(daysInMonth(2, 2000)); // February in a leap year.

Tag 0 ist der letzte Tag im Monat zuvor. Da der Monatskonstruktor 0-basiert ist, funktioniert das gut. Ein bisschen ein Hack, aber das ist im Grunde, was Sie tun, indem Sie 32 subtrahieren.

+35

Diese Syntax hat mich für eine Weile verwirrt. Um das JS Muster zu folgen werde ich empfehlen, den Trick wie folgt umzusetzen: 'return new Date (Jahr, Monat + 1, 0) .getDate();' – fguillen

+2

Leider versagt diese für Termine vor dem Jahr 1000 AD, wo können Sie nur die Set Jahr korrekt mit SetFullYear(). Um es kugelsichere Verwendung new Date (2000+ (Jahr% 2000), Monat, 0) .getDate() –

+4

Hinweis auf meine Zukunft selbst zu machen: fguillen Gleichung mit den ‚+ 1‘ werden 28 Tage, an denen das Jahr 2014 und der Monat ist 1 (was in JavaScript Date-Objekt bedeutet Februar). Wahrscheinlich damit zumindest zum Erstaunen gehen wollen. Aber was für eine großartige Idee von FlySwat! –

7

Wenn Sie diese Funktion oft aufrufen, kann es nützlich sein, den Wert für eine bessere Leistung zwischenzuspeichern.

Hier wird das Caching Version von FlySwat's answer:

var daysInMonth = (function() { 
    var cache = {}; 
    return function(month, year) { 
     var entry = year + '-' + month; 

     if (cache[entry]) return cache[entry]; 

     return cache[entry] = new Date(year, month, 0).getDate(); 
    } 
})(); 
+5

Ist die interne C/C++ - Routine so langsam, dass dies Caching erfordert? –

+1

@PeteAlvin Es ist auf die Durchführung von 'Date' abhängt (so gibt es keine allgemeingültige Antwort auf diese Frage) und wie oft Ihr Code wird das' dayInMonth' mit den gleichen Werten nennen. Die einzige vernünftige Antwort ist: Profiliere deinen Code und vergleiche ihn! – dolmen

+1

Ich mag es! Aber anstatt ein neues Objekt, 'cache', zu verwenden, verwende ich' localStorage'. – andrew

0
function numberOfDays(iMonth, iYear) { 
     var myDate = new Date(iYear, iMonth + 1, 1); //find the fist day of next month 
     var newDate = new Date(myDate - 1); //find the last day 
      return newDate.getDate();   //return # of days in this month 
     } 
5

einige Antworten (auch auf andere Fragen) Schaltjahr Probleme hatten oder verwendet, um das Datum-Objekt. Obwohl die Date object von javascript etwa 285616 Jahre (100.000.000 Tage) auf beiden Seiten des 1. Januar 1970 umfasst, hatte ich die Nase voll von allen Arten von unerwartetem Datum inconsistencies über verschiedene Browser (vor allem Jahr 0 bis 99). Ich war auch neugierig, wie ich es berechnen soll.

Also schrieb ich eine einfache und vor allem kleinen Algorithmus die korrekte (ProlepticGregorian/astronomisches/ISO 8601 zu berechnen: 2004 (Abschnitt 4.3.2.1), so existiert year 0 und ein Schaltjahr und negative Jahre werden unterstützt) Anzahl der Tage für einen bestimmten Monat und Jahr.
Es verwendet den short-circuit bitmask-modulo leapYear algorithm (leicht für js geändert) und allgemeinen Mod-8-Monats-Algorithmus.

Beachten Sie, dass in AD/BC Notation, Jahr 0 AD/BC nicht existiert: statt Jahr 1 BC ist das Schaltjahr!
Wenn Sie die BC-Notation berücksichtigen müssen, dann ziehen Sie einfach ein Jahr des (sonst positiven) Jahreswertes ab! (Oder subtrahieren das Jahr von 1 für weitere Jahre Berechnungen.)

function daysInMonth(m, y){ 
 
    return m===2?y&3||!(y%25)&&y&15?28:29:30+(m+(m>>3)&1); 
 
}
<!-- example for the snippet --> 
 
<input type="text" value="enter year" onblur=" 
 
    for(var r='', i=0, y=+this.value 
 
    ; 12>i++ 
 
    ; r+= 'Month: ' + i + ' has ' + daysInMonth(i, y) + ' days<br>' 
 
    ); 
 
    this.nextSibling.innerHTML=r; 
 
" /><div></div>

Hinweis, Monate 1-basierte werden müssen!

Hinweis, dies ist ein anderer Algorithmus als die magische Zahl Lookup, die ich in meiner Javascript calculate the day of the year (1 - 366) Antwort verwendet, weil hier der extra Zweig für das Schaltjahr nur für Februar benötigt wird.

0

Unter Berücksichtigung von Schaltjahren:

function (year, month) { 
    var isLeapYear = ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); 

    return [31, (isLeapYear ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 
} 
3

Verwirrung wegnehmen würde ich wahrscheinlich den Monat String machen basiert, wie es zur Zeit ist 1 basiert.

function daysInMonth(month,year) { 
    monthNum = new Date(Date.parse(month +" 1,"+year)).getMonth()+1 
    return new Date(year, monthNum, 0).getDate(); 
} 

daysInMonth('feb', 2015) 
//28 

daysInMonth('feb', 2008) 
//29 
2

Mit moment.js können Sie DaysInMonth() -Methode verwenden:

moment().daysInMonth(); // number of days in the current month 
moment("2012-02", "YYYY-MM").daysInMonth() // 29 
moment("2012-01", "YYYY-MM").daysInMonth() // 31 
1

Einzeiler direkte Berechnung (kein Objekt Date):

function daysInMonth(m, y) {//m is 1-based, feb = 2 
 
    return 31 - (--m^1? m % 7 & 1: y & 3? 3: y % 25? 2: y & 15? 3: 2); 
 
} 
 

 
console.log(daysInMonth(2, 1999)); // February in a non-leap year 
 
console.log(daysInMonth(2, 2000)); // February in a leap year

Variation mit 0-basierte Monate:

function daysInMonth(m, y) {//m is 0-based, feb = 1 
    return 31 - (m^1? m % 7 & 1: y & 3? 3: y % 25? 2: y & 15? 3: 2); 
} 
1

Wenn Sie die Anzahl der Tage im aktuellen Monat eines Date-Objekts möchten, sollten Sie die folgende Methode:

Date.prototype.getNumberOfDaysInMonth = function(monthOffset) { 
    if (monthOffset !== undefined) { 
     return new Date(this.getFullYear(), this.getMonth()+monthOffset, 0).getDate(); 
    } else { 
     return new Date(this.getFullYear(), this.getMonth(), 0).getDate(); 
    } 
} 

Dann können Sie es wie folgt ausführen:

var myDate = new Date(); 
myDate.getNumberOfDaysInMonth(); // Returns 28, 29, 30, 31, etc. as necessary 
myDate.getNumberOfDaysInMonth(); // BONUS: This also tells you the number of days in past/future months! 
0

In eine einzige Zeile:

// month is 1-12 
function getDaysInMonth(year, month){ 
    return month == 2 ? 28 + (year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? 1 : 0) : 1):0) : 31 - (month - 1) % 7 % 2; 
} 
0

Vielleicht nicht die eleganteste Lösung, aber e asy zu verstehen und beizubehalten; und es ist kampferprobt.

function daysInMonth(month, year) { 
    var days; 
    switch (month) { 
     case 1: // Feb, our problem child 
      var leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); 
      days = leapYear ? 29 : 28; 
      break; 
     case 3: case 5: case 8: case 10: 
      days = 30; 
      break; 
     default: 
      days = 31; 
     } 
    return days; 
}, 
Verwandte Themen