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.
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
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() –
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! –