উত্তর:
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হয় 12 ? Dateকনস্ট্রাক্টরের 0 থেকে 11 পর্যন্ত কোনও মান নেওয়া উচিত নয় ?
আপনি যদি এই ফাংশনটি প্রায়শই কল করেন তবে ভাল পারফরম্যান্সের জন্য মানটি ক্যাশে করা কার্যকর হতে পারে।
এখানে ফ্লাইওয়াত এর উত্তরের সংস্করণটি দেওয়া হচ্ছে :
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 objectকভারেজ প্রায় ২৮৫6১ years বছর (১,০০,০০,০০০ দিন) একদিকে জানুয়ারী ১, ১৯ of০ এর উভয় পক্ষেই, আমি বিভিন্ন ব্রাউজারগুলিতে সমস্ত ধরণের অপ্রত্যাশিত তারিখের অসঙ্গতিতে বিরক্ত হয়েছি (বিশেষত বছর 0 থেকে 99)। আমি কীভাবে এটি হিসাব করব তা জানতে আগ্রহী ছিলাম।
তাই আমি সঠিক ( প্রলেপটিক গ্রেগরিয়ান / অ্যাস্ট্রোনমিক্যাল / আইএসও 8601: 2004 (ধারা ৪.৩.২.১) গণনা করার জন্য একটি সহজ এবং সর্বোপরি ছোট অ্যালগরিদম লিখেছি , সুতরাং বছরটি বিদ্যমান এবং এটি একটি লিপ বছর এবং নেতিবাচক বছরগুলি সমর্থিত ) দিনের জন্য সংখ্যা একটি প্রদত্ত মাস এবং বছর।
এটি শর্ট-সার্কিট বিটমাস্ক-মডুলো লিপইয়ার অ্যালগরিদম ( জেএসের জন্য কিছুটা সংশোধিত) এবং সাধারণ মোড -8 মাসের অ্যালগরিদম ব্যবহার করে। 0
উল্লেখ্য যে AD/BCশিরোনামে, বছর 0 খ্রিস্টাব্দ / বিসি বিদ্যমান নেই: পরিবর্তে বছরটি 1 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-ভিত্তিক হতে হবে!
দ্রষ্টব্য, এটি আমার আলাদা জাভাস্ক্রিপ্টে যে ম্যাজিক নম্বর অনুসন্ধানটি ব্যবহার করা হয়েছিল তা বছরের একদিন (1 - 366) উত্তর গণনা করে , এটি একটি আলাদা অ্যালগরিদম কারণ এখানে লিপ-বর্ষের জন্য অতিরিক্ত শাখা কেবল ফেব্রুয়ারির জন্য প্রয়োজন।
বিভ্রান্তি দূর করতে আমি সম্ভবত মাসের স্ট্রিংটি বর্তমানে 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
এখানে যায়
new Date(2019,2,0).getDate(); //28
new Date(2020,2,0).getDate(); //29
ES6 সিনট্যাক্স
const d = (y, m) => new Date(y, m, 0).getDate();
আয়
console.log( d(2020, 2) );
// 29
console.log( d(2020, 6) );
// 30
লিপ বছর বিবেচনা:
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];
}
ওয়ান-লাইনার সরাসরি গণনা (কোনও তারিখের অবজেক্ট নেই):
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.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();