С вычислительной точки зрения, new Date()
и regular expression
решения slow! Если вы хотите супер-быстрый (и сверхкритический) однострочный, попробуйте этот вариант (если m
находится в формате Jan=1
). Я продолжаю пробовать разные изменения кода, чтобы получить лучшую производительность.
Моя текущая версия быстрый:
После просмотра этого соответствующий вопрос Leap year check using bitwise operators (amazing speed) и обнаружив, что 25 & 15 магическое число представлено, я пришел с оптимизированной гибрида ответов:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
JSFiddle:http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Результаты JSPerf:http://jsperf.com/days-in-month-head-to-head/5
По какой-то причине, (m+(m>>3)&1)
является более эффективным, чем (5546>>m&1)
на почти всех браузеров.
Единственная реальная конкуренция по скорости от @GitaarLab, поэтому я создал голова к голове JSPerf для нас, чтобы испытать на: http://jsperf.com/days-in-month-head-to-head/5
Он работает на основе моего високосного года ответ здесь: javascript to find leap year этот ответ здесь Leap year check using bitwise operators (amazing speed), а также следующая бинарная логика.
Быстрый урок в двоичных месяцах:
Если интерпретировать индекс желаемые месяцев (январь = 1) в двоичном вы заметите, что месяцы с 31 дней или иметь немного 3 ясно и бит 0 или бит 3 и бит 0 очистить.
Jan = 1 = 0001 : 31 days
Feb = 2 = 0010
Mar = 3 = 0011 : 31 days
Apr = 4 = 0100
May = 5 = 0101 : 31 days
Jun = 6 = 0110
Jul = 7 = 0111 : 31 days
Aug = 8 = 1000 : 31 days
Sep = 9 = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days
Это означает, что вы можете сдвинуть значение 3 места с >> 3
, XOR биты с оригинальным ^ m
и посмотреть, если результат 1
или 0
в битовой позиции 0 с использованием & 1
. Примечание: Оказывается +
немного быстрее, чем XOR (^
) и (m >> 3) + m
дает тот же результат в бите 0.
JSPerf приводит: http://jsperf.com/days-in-month-perf-test/6
Не имеете в виду последний день месяца, указанный? Есть 30 дней в ноябре и 31 октября. – 2008-10-21 15:38:44
Месяцы основаны на нулевом значении в javascript, так что 11 декабря – Greg 2008-10-21 15:40:31
@TheCloudlessSky - попробуйте в консоли ... (2008,11,0) - это нулевой день декабря, и поэтому последний день ноября – Ken 2011-09-05 07:24:54