Jawaban:
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.
Hari ke 0 adalah hari terakhir di bulan sebelumnya. Karena konstruktor bulan berbasis 0, ini berfungsi dengan baik. Sedikit hack, tapi pada dasarnya itulah yang Anda lakukan dengan mengurangi 32.
var d=new Date();d.setFullYear(year, month, date);.
monthyang 12 ? Bukankah seharusnya Datekonstruktor mengambil nilai dari 0 hingga 11 ?
Jika Anda sering memanggil fungsi ini, mungkin berguna untuk menyimpan nilai dalam cache untuk kinerja yang lebih baik.
Berikut adalah versi cache dari jawaban 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(jadi tidak ada jawaban universal untuk pertanyaan itu) dan seberapa sering kode Anda akan memanggil dayInMonthdengan nilai yang sama. Jadi satu-satunya jawaban yang masuk akal adalah: buat profil kode Anda dan tolok ukurnya!
cache,, saya menggunakan localStorage.
Beberapa jawaban (juga pada pertanyaan lain) memiliki masalah tahun kabisat atau menggunakan objek Tanggal. Meskipun javascript Date objectmencakup kira-kira 285616 tahun (100.000.000 hari) di kedua sisi tanggal 1 Januari 1970, saya muak dengan semua jenis inkonsistensi tanggal yang tidak terduga di berbagai browser (terutama tahun 0 hingga 99). Saya juga penasaran bagaimana cara menghitungnya.
Jadi saya menulis yang sederhana dan di atas segalanya, algoritma kecil untuk menghitung jumlah hari yang benar ( Proleptic Gregorian / Astronomical / ISO 8601: 2004 (klausul 4.3.2.1), jadi tahun0 ada dan merupakan tahun kabisat dan tahun negatif didukung ) jumlah hari untuk bulan dan tahun tertentu.
Ini menggunakan algoritma bitmask-modulo leapYear sirkuit pendek (sedikit dimodifikasi untuk js) dan algoritma umum mod-8 bulan.
Perhatikan bahwa dalam AD/BCnotasi, tahun 0 M / SM tidak ada: sebagai gantinya tahun 1 BCadalah tahun kabisat!
JIKA Anda perlu menghitung notasi BC maka kurangi satu tahun dari nilai tahun (jika tidak positif) dulu !! (Atau kurangi tahun dari 1untuk perhitungan tahun selanjutnya.)
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>
Perhatikan, bulan harus berbasis 1!
Catatan, ini adalah algoritma yang berbeda maka pencarian angka ajaib yang saya gunakan dalam Javascript saya menghitung hari dalam setahun (1 - 366) jawaban, karena di sini cabang tambahan untuk tahun kabisat hanya diperlukan untuk bulan Februari.
Untuk menghilangkan kebingungan saya mungkin akan membuat string bulan berbasis karena saat ini berbasis 1.
function daysInMonth(month,year) {
monthNum = new Date(Date.parse(month +" 1,"+year)).getMonth()+1
return new Date(year, monthNum, 0).getDate();
}
daysInMonth('feb', 2015)
//28
daysInMonth('feb', 2008)
//29
Ini dia
new Date(2019,2,0).getDate(); //28
new Date(2020,2,0).getDate(); //29
Sintaks ES6
const d = (y, m) => new Date(y, m, 0).getDate();
kembali
console.log( d(2020, 2) );
// 29
console.log( d(2020, 6) );
// 30
Mempertimbangkan tahun kabisat:
function (year, month) {
var isLeapYear = ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);
return [31, (isLeapYear ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
}
Perhitungan langsung satu baris (tanpa objek Tanggal):
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
Variasi dengan bulan berbasis 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);
}
Jika Anda menginginkan jumlah hari di bulan saat ini dari objek Tanggal, pertimbangkan metode berikut:
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();
}
}
Kemudian Anda dapat menjalankannya seperti ini:
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!
Mungkin agak berlebihan jika dibandingkan dengan jawaban yang dipilih :) Tapi ini dia:
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));
Saya menemukan kode di atas di sini: 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));
Saya menemukan kode di atas di sini: https://github.com/datejs/Datejs/blob/master/src/core.js
Jika Anda akan meneruskan variabel tanggal, ini mungkin membantu
const getDaysInMonth = date =>
new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
daysInThisMonth = getDaysInMonth(new Date());
console.log(daysInThisMonth);
Mungkin bukan solusi yang paling elegan, tetapi mudah dipahami dan dipelihara; dan, itu teruji dalam pertempuran.
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();