回答:
function daysInMonth (month, year) { // Use 1 for January, 2 for February, etc.
return new Date(year, month, 0).getDate();
}
console.log(daysInMonth(2, 1999)); // February in a non-leap year.
console.log(daysInMonth(2, 2000)); // February in a leap year.
0日目は前月の最終日です。月コンストラクタは0ベースであるため、これはうまく機能します。少しハックですが、基本的には32を減算することで行っています。
var d=new Date();d.setFullYear(year, month, date);
。
month
はどうなりますか?コンストラクターは0から11までの値を取るべきではありませんか?Date
この関数を頻繁に呼び出す場合は、パフォーマンスを向上させるために値をキャッシュしておくと便利です。
FlySwatの回答のキャッシュバージョンは次のとおりです。
var daysInMonth = (function() {
var cache = {};
return function(month, year) {
var entry = year + '-' + month;
if (cache[entry]) return cache[entry];
return cache[entry] = new Date(year, month, 0).getDate();
}
})();
Date
(その質問に対する普遍的な答えはありません)の実装と、コードがdayInMonth
同じ値でを呼び出す頻度に依存します。したがって、唯一の賢明な答えは、コードをプロファイルしてベンチマークすることです。
cache
、を使用しますlocalStorage
。
一部の回答(他の質問についても)には、うるう年の問題があるか、Dateオブジェクトが使用されていました。Date object
1970年1月1日のどちらの側でも、javascript は約285616年(1億日)をカバーしますが、さまざまなブラウザー(特に0から99年)全体で、あらゆる種類の予期しない日付の不一致にうんざりしていました。計算方法にも興味がありました。
だから私は正しい(Proleptic Gregorian / Astronomical / ISO 8601:2004(clause 4.3.2.1))を計算するためのシンプルで何よりも小さなアルゴリズムを書いたので、年が存在し、うるう年であり、負の年がサポートされています)の日数特定の月と年。
これは、使用短絡ビットマスク-モジュロleapYearアルゴリズム(わずかにJSのために修正された)と共通MOD-8月アルゴリズム。 0
AD/BC
表記では、0年のAD / BCは存在しないことに注意してください。代わりに、年1 BC
はうるう年です。
BC表記を考慮する必要がある場合は、最初に(そうでなければ正の)年の値から1年を引いてください!! (または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)の回答を計算するのとは異なります。うるう年の追加のブランチが必要なのは2月だけだからです。
ES6の構文
const d = (y, m) => new Date(y, m, 0).getDate();
戻り値
console.log( d(2020, 2) );
// 29
console.log( d(2020, 6) );
// 30
ワンライナー直接計算(Dateオブジェクトなし):
function daysInMonth(m, y) {//m is 1-based, feb = 2
return 31 - (--m ^ 1? m % 7 & 1: y & 3? 3: y % 25? 2: y & 15? 3: 2);
}
console.log(daysInMonth(2, 1999)); // February in a non-leap year
console.log(daysInMonth(2, 2000)); // February in a leap year
0から始まる月のバリエーション:
function daysInMonth(m, y) {//m is 0-based, feb = 1
return 31 - (m ^ 1? m % 7 & 1: y & 3? 3: y % 25? 2: y & 15? 3: 2);
}
Dateオブジェクトの当月の日数が必要な場合は、次のメソッドを検討してください。
Date.prototype.getNumberOfDaysInMonth = function(monthOffset) {
if (monthOffset !== undefined) {
return new Date(this.getFullYear(), this.getMonth()+monthOffset, 0).getDate();
} else {
return new Date(this.getFullYear(), this.getMonth(), 0).getDate();
}
}
その後、次のように実行できます。
var myDate = new Date();
myDate.getNumberOfDaysInMonth(); // Returns 28, 29, 30, 31, etc. as necessary
myDate.getNumberOfDaysInMonth(); // BONUS: This also tells you the number of days in past/future months!
選択した回答と比較すると、殺しすぎかもしれません:)しかし、ここにあります:
function getDayCountOfMonth(year, month) {
if (month === 3 || month === 5 || month === 8 || month === 10) {
return 30;
}
if (month === 1) {
if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) {
return 29;
} else {
return 28;
}
}
return 31;
};
console.log(getDayCountOfMonth(2020, 1));
私はここに上記のコードを見つけました:https : //github.com/ElemeFE/element/blob/dev/src/utils/date-util.js
function isLeapYear(year) {
return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);
};
const getDaysInMonth = function (year, month) {
return [31, (isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
};
console.log(getDaysInMonth(2020, 1));
私はここに上記のコードを見つけました:https://github.com/datejs/Datejs/blob/master/src/core.js
日付変数を渡す場合は、これが役立つ場合があります
const getDaysInMonth = date =>
new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
daysInThisMonth = getDaysInMonth(new Date());
console.log(daysInThisMonth);
おそらく最もエレガントなソリューションではありませんが、理解と保守が簡単です。そして、それは戦いでテストされています。
function daysInMonth(month, year) {
var days;
switch (month) {
case 1: // Feb, our problem child
var leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
days = leapYear ? 29 : 28;
break;
case 3: case 5: case 8: case 10:
days = 30;
break;
default:
days = 31;
}
return days;
},
return new Date(year, month + 1, 0).getDate();