Я использовал эту функцию, но хотел бы знать, какой способ ее получить наиболее эффективный и точный.
function daysInMonth(iMonth, iYear) {
return 32 - new Date(iYear, iMonth, 32).getDate();
}
javascript
date
Чату
источник
источник
return new Date(year, month + 1, 0).getDate();
var d=new Date();d.setFullYear(year, month, date);
.month
есть 12 ? РазвеDate
конструктор не должен принимать значение от 0 до 11 ?Если вы часто вызываете эту функцию, может быть полезно кэшировать значение для повышения производительности.
Вот кеширующая версия ответа FlySwat :
источник
Date
(поэтому универсального ответа на этот вопрос нет) и от того, как часто ваш код будет вызыватьdayInMonth
с одинаковыми значениями. Итак, единственный разумный ответ: профилируйте свой код и сравните его!cache
я используюlocalStorage
.В некоторых ответах (также на другие вопросы) были проблемы с високосным годом или использовался объект Date. Хотя javascript
Date object
охватывает примерно 285616 лет (100000000 дней) по обе стороны от 1 января 1970 года, мне надоели всевозможные неожиданные несоответствия дат в разных браузерах (особенно с 0 по 99 год). Мне также было любопытно, как это рассчитать.Поэтому я написал простой и, прежде всего, небольшой алгоритм для вычисления правильного ( Proleptic Gregorian / Astronomical / ISO 8601: 2004 (пункт 4.3.2.1), поэтому год
0
существует и является високосным, и поддерживаются отрицательные годы ) количества дней для данный месяц и год.Он использует алгоритм короткого замыкания bitmask-modulo leapYear (немного изменен для js) и общий алгоритм mod-8 месяцев.
Обратите внимание, что в
AD/BC
нотации год 0 AD / BC не существует: вместо этого год1 BC
является високосным!ЕСЛИ вам нужно учесть нотацию BC, тогда просто сначала вычтите один год из (в противном случае положительного) годового значения !! (Или вычтите год из
1
для дальнейших расчетов года.)Обратите внимание, месяцы должны начинаться с 1!
Обратите внимание, что это другой алгоритм, чем поиск по магическому числу, который я использовал в своем Javascript, вычисляющий день года (1 - 366) , потому что здесь дополнительная ветка для високосного года нужна только для февраля.
источник
Чтобы устранить путаницу, я бы, вероятно, сделал строку месяца на основе, поскольку в настоящее время она основана на 1.
источник
В moment.js вы можете использовать метод daysInMonth ():
источник
Вот идет
источник
Синтаксис ES6
возвращается
источник
источник
С учетом високосных лет:
источник
Однострочное прямое вычисление (без объекта Date):
Вариация с нулевыми месяцами:
источник
Если вам нужно количество дней в текущем месяце объекта Date, рассмотрите следующий метод:
Тогда вы можете запустить его так:
источник
Одной строкой:
источник
Может быть, немного убить по сравнению с выбранным ответом :) Но вот он:
Я нашел приведенный выше код здесь: https://github.com/ElemeFE/element/blob/dev/src/utils/date-util.js
Я нашел приведенный выше код здесь: https://github.com/datejs/Datejs/blob/master/src/core.js
источник
Если вы собираетесь передать переменную даты, это может быть полезно
источник
Возможно, не самое элегантное решение, но простое для понимания и обслуживания; и это проверено в боях.
источник