জাভাস্ক্রিপ্ট দিয়ে মাসে একদিনের সংখ্যা নির্ধারণের সেরা উপায় কী?


107

আমি এই ফাংশনটি ব্যবহার করে আসছি তবে আমি এটি পেতে সবচেয়ে কার্যকর এবং সঠিক উপায়টি জানতে চাই।

function daysInMonth(iMonth, iYear) {
   return 32 - new Date(iYear, iMonth, 32).getDate();
}

উত্তর:


200

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 টি বিয়োগ করে আপনি যা করছেন তা মূলত।


42
এই বাক্য গঠনটি আমাকে কিছুক্ষণের জন্য বিভ্রান্ত করে চলেছে। জাতীয় প্যাটার্ন অনুসরণ করতে আমি ভালো কৌতুক বাস্তবায়ন সুপারিশ করব:return new Date(year, month + 1, 0).getDate();
fguillen

2
দুর্ভাগ্যক্রমে এটি 1000 খ্রিস্টাব্দের পূর্বে তারিখগুলির জন্য ব্যর্থ হয় যেখানে আপনি কেবল সেটফুলয়ার () ব্যবহার করে বছরটি সঠিকভাবে সেট করতে পারেন। এটা বুলেট প্রমাণ ব্যবহারের নতুন তারিখ (2000+ (বছর% 2000), মাস, 0) .getDate () করতে
ক্রিস্ট্মাস ওয়াল্টার্স

4
আমার ভবিষ্যত-স্বকে নোট করুন: '+ 1' এর সাথে ফিউগিলেনের সমীকরণটি ২০১৪ সাল হওয়ার সময় ২৮ দিন দেয় এবং মাসটি ১ হয় (যা জাভাস্ক্রিপ্টের তারিখ-অবজেক্টে মানে ফেব্রুয়ারি)। সম্ভবত এটির সাথে অন্তত বিস্ময়ের জন্য যেতে চান। তবে ফ্লাইওয়াত থেকে কী দুর্দান্ত ধারণা!
হ্যারি পেহকোনেন

@ নোয়েলওয়াল্টারস — আপনি ঠিক বলেছেন যে কিছু ব্রাউজার দু'বারের অঙ্ককে ভুলভাবে বিশ শতকের তারিখে রূপান্তরিত করে (সুতরাং ১০০০ খ্রিস্টাব্দের পূর্বে তারিখগুলি ১০০০ খ্রিস্টাব্দের নয়), তবে আপনার ফিক্সগুলি সেই ব্রাউজারগুলিতে তা সংশোধন করে না। দুই অঙ্ক বছর নির্ভরযোগ্যভাবে সেট করার একমাত্র উপায় ব্যবহার করা setFullYear : var d=new Date();d.setFullYear(year, month, date);
রবজি

1
কি হবে যদি monthহয় 12 ? Dateকনস্ট্রাক্টরের 0 থেকে 11 পর্যন্ত কোনও মান নেওয়া উচিত নয় ?
অ্যান্ডেরো

8

আপনি যদি এই ফাংশনটি প্রায়শই কল করেন তবে ভাল পারফরম্যান্সের জন্য মানটি ক্যাশে করা কার্যকর হতে পারে।

এখানে ফ্লাইওয়াত এর উত্তরের সংস্করণটি দেওয়া হচ্ছে :

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();
    }
})();

6
অভ্যন্তরীণ সি / সি ++ রুটিন কি এত ধীর হয় যে এর জন্য ক্যাশিং দরকার?
পিট অ্যালভিন

1
@ পিটএলভিন এটি প্রয়োগের উপর নির্ভর করে Date(সুতরাং সেই প্রশ্নের কোনও সার্বজনীন উত্তর নেই) এবং কতবার আপনার কোড dayInMonthএকই মানগুলির সাথে কল করবে । সুতরাং একমাত্র বুদ্ধিমান উত্তর হ'ল: আপনার কোডটি প্রোফাইল করুন এবং এটিকে মাপদণ্ড করুন!
ডলম্যান

1
আমি এটা পছন্দ করি! পরিবর্তে একটি নতুন অবজেক্ট ব্যবহার না করে cache, আমি ব্যবহার করি localStorage
অ্যান্ড্রু

5

কিছু উত্তরে (অন্যান্য প্রশ্নের ক্ষেত্রেও) লিপ-ইয়ার সমস্যা ছিল বা ডেট-অবজেক্ট ব্যবহার করা হয়েছিল। যদিও জাভাস্ক্রিপ্টের 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) উত্তর গণনা করে , এটি একটি আলাদা অ্যালগরিদম কারণ এখানে লিপ-বর্ষের জন্য অতিরিক্ত শাখা কেবল ফেব্রুয়ারির জন্য প্রয়োজন।


4

বিভ্রান্তি দূর করতে আমি সম্ভবত মাসের স্ট্রিংটি বর্তমানে 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



2

ES6 সিনট্যাক্স

const d = (y, m) => new Date(y, m, 0).getDate();

আয়

console.log( d(2020, 2) );
// 29

console.log( d(2020, 6) );
// 30

1
১৪ টি বিদ্যমান উত্তরের সাথে কোনও পুরানো প্রশ্নের নতুন উত্তর যুক্ত করার সময় আপনার উত্তরটির প্রশ্নের নতুন দিকটি কী যুক্তিযুক্ত তা লক্ষ করা সত্যিই গুরুত্বপূর্ণ। এটি কি কেবল ES6 সিনট্যাক্স?
জেসন অ্যালার

বুঝেছি. এখন থেকে উত্তরে প্রসঙ্গ যুক্ত করবে।
আরএসজি

1
function numberOfDays(iMonth, iYear) {
         var myDate = new Date(iYear, iMonth + 1, 1);  //find the fist day of next month
         var newDate = new Date(myDate - 1);  //find the last day
            return newDate.getDate();         //return # of days in this month
        }

1

লিপ বছর বিবেচনা:

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];
}

খুশী হলাম। দেখতে সহজ। একটি ইনলাইন-মানচিত্র / তাত্ক্ষণিকভাবে-মূলযুক্ত মান ব্যবহারের জন্য প্রপ [এরটি] গুলি।
শে

1

ওয়ান-লাইনার সরাসরি গণনা (কোনও তারিখের অবজেক্ট নেই):

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);
}

1

আপনি যদি কোনও তারিখের অবজেক্টের বর্তমান মাসে কত দিনের সংখ্যা চান তবে নিম্নলিখিত পদ্ধতিটি বিবেচনা করুন:

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!

1

একক লাইনে:

// month is 1-12
function getDaysInMonth(year, month){
    return month == 2 ? 28 + (year % 4 == 0 ? (year % 100 == 0 ? (year % 400 == 0 ? 1 : 0) : 1):0) : 31 - (month - 1) % 7 % 2;
}

1

নির্বাচিত উত্তরের তুলনায় কিল ওভার হতে পারে :) তবে এটি এখানে:

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


1

আপনি যদি একটি তারিখ ভেরিয়েবল পাস করতে চলেছেন তবে এটি সহায়ক হতে পারে

const getDaysInMonth = date =>
  new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();

daysInThisMonth = getDaysInMonth(new Date());

console.log(daysInThisMonth);


-1

সম্ভবত সবচেয়ে মার্জিত সমাধান নয়, তবে বুঝতে এবং বজায় রাখা সহজ; এবং, এটি যুদ্ধ-পরীক্ষিত।

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;
},
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.