Algunas respuestas (también en otras cuestiones) tenía problemas de años bisiestos o utilizará la fecha a objetos. Aunque el Date object
de javascript cubre aproximadamente 285616 años (100,000,000 días) a cada lado del 1 de enero de 1970, estaba harto de todo tipo de fechas inesperadas inconsistencies en diferentes navegadores (más notablemente en el año 0 a 99). También tenía curiosidad por cómo calcularlo.
Así que escribió un sencillo y, sobre todo, pequeña algoritmo para calcular la correcta (ProlepticGregorian/astronómico/ISO 8601: 2004 (cláusula 4.3.2.1), por lo year 0
existe y es un año bisiesto y años negativos son compatibles) número de días para un mes y año dados.
Utiliza el algoritmo short-circuit bitmask-modulo leapYear algorithm (ligeramente modificado para js) y el mod-8 de mes común.
Tenga en cuenta que en la notación AD/BC
, año 0 AD/BC no existe: en su lugar año 1 BC
es el año bisiesto!
SI necesita registrar la notación BC, simplemente restar un año del valor anual (de lo contrario positivo) primero !! (O restar el año de 1
para más años de cálculos.)
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>
Nota, meses deben basarse-1!
Nota, este es un algoritmo diferente a la búsqueda de número mágico que utilicé en mi respuesta Javascript calculate the day of the year (1 - 366), porque aquí la rama adicional para el año bisiesto solo es necesaria para febrero.
esta sintaxis me ha estado confundiendo por un tiempo. Para seguir el patrón de JS, recomendaré implementar el truco de esta manera: 'return new Date (year, month + 1, 0) .getDate();' – fguillen
Desafortunadamente, esto falla para las fechas anteriores al 1000 AD donde solo se puede configurar el año correctamente al usar SetFullYear(). Para que sea a prueba de balas, use nueva Fecha (2000+ (año% 2000), mes, 0) .getDate() –
Nota para mi yo futuro: la ecuación de fguillen con el '+ 1' da 28 días cuando el año es 2014 y el mes es 1 (que, en JavaScript Date-object, significa febrero). Probablemente quiera ir con eso para al menos asombro. ¡Pero qué gran idea de FlySwat! –