В некоторых ответах (также на другие вопросы) были проблемы високосного года или использовался объект Date. Хотя javascript Date object
охватывает примерно 285616 лет (100 000 000 дней) по обе стороны от 1 января 1970 года, я был сыт по горло всевозможными неожиданными несоответствиями в разных браузерах (особенно в возрасте от 0 до 99). Мне также было любопытно, как рассчитать это.
Итак, я написал простой и прежде всего маленький алгоритм для вычисления правильного ( Proleptic григорианского / Астрономический / ISO 8601 : 2004 (пункт 4.3.2.1), поэтому год 0
существует и является високосным годом, а отрицательные годы поддерживаются ) числом дней для данного месяца и года.
Он использует алгоритм битовой маски короткого замыкания по модулю leapYear (слегка измененный для js) и общий алгоритм mod-8 month.
Обратите внимание, что в нотации AD/BC
год 0 нашей эры / BC не существует: вместо этого год 1 BC
является високосным годом!
ЕСЛИ вам нужно учесть нотацию BC, то сначала вычтите один год из (иначе положительного) значения года !! (Или вычтите год из 1
для дальнейших вычислений года.)
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>
Обратите внимание, месяцы должны быть на основе 1!
Обратите внимание, что этот алгоритм отличается от алгоритма поиска магических чисел, который я использовал в своем Javascript для вычисления дня года (1 - 366) , потому что здесь дополнительная ветвь для високосного года нужен только на февраль.