আমি আজ থেকে তিন মাস আগে জাভাস্ক্রিপ্টে তারিখটি কীভাবে গণনা করব?


147

আমি বর্তমান তারিখের 3 মাস পূর্বে একটি তারিখ গঠনের চেষ্টা করছি। আমি নীচের কোড দিয়ে চলতি মাসটি পাই

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

আপনি কি আমাকে গণনা করতে এবং একটি তারিখ ( Dateডেটা টাইপের একটি অবজেক্ট ) গঠনের যুক্তি সরবরাহ করতে পারেন যে মাসটি জানুয়ারী (1) হওয়ার পরে, তারিখের 3 মাস আগে ওসিটোবার (10) হবে?

উত্তর:


323
var d = new Date();
d.setMonth(d.getMonth() - 3);

এটি জানুয়ারীর জন্য কাজ করে। এই স্নিপেট চালান:

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());


কিছু সতর্কতা আছে ...

এক মাস একটি কৌতূহলী জিনিস। আপনি কিভাবে 1 মাস সংজ্ঞায়িত করবেন? 30 দিন? বেশিরভাগ লোকেরা বলবেন যে এক মাস আগে মানে পূর্ববর্তী মাসের একই দিনটির উদ্ধৃতি দেওয়া দরকার । তবে অর্ধেকেরও বেশি সময়, যা ৩০ দিনের আগে, 30 নয়।

মজার বিষয় হল, গুগল জাভাস্ক্রিপ্টের সাথে একমত হয় যদি আপনি এটি জিজ্ঞাসা করেন যে কোনও এক মাসের আগের দিনটি কোন দিন :

'৩১ শে মার্চের এক মাস আগে' গুগল অনুসন্ধান ফলাফল 'মার্চ তৃতীয়' দেখায়

এটি আরও বলে যে এক মাস 30.4167 দিন দীর্ঘ : '30 একমাসের জন্য 'গুগল অনুসন্ধান ফলাফল '30 .4167' দেখায়

সুতরাং, ২১ শে মার্চের এক মাস আগে ২৮ শে মার্চের এক মাসের মতো একই দিন, ৩ দিন আগে? এটি সমস্ত "এক মাস আগে" আপনি কী বোঝাতে চান তার উপর নির্ভর করে। যান আপনার পণ্যের মালিকের সাথে কথোপকথন করুন।

আপনি যদি মুহুর্তের মতো কাজ করতে চান এবং মাসের শেষ দিনটিতে গিয়ে মাসের এই শেষ ত্রুটিগুলি সংশোধন করতে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

আপনার প্রয়োজনীয়তা যদি এর চেয়ে জটিল হয় তবে কিছু গণিত ব্যবহার করুন এবং কিছু কোড লিখুন। আপনি একজন বিকাশকারী! আপনাকে কোনও লাইব্রেরি ইনস্টল করতে হবে না! আপনি স্ট্যাকওভারফ্লো থেকে অনুলিপি এবং পেস্ট করতে হবে না! আপনার যা প্রয়োজন তা সুনির্দিষ্টভাবে করার জন্য কোডটি নিজেই বিকাশ করতে পারেন!


var বর্তমান তারিখ = নতুন তারিখ (); var currentMonth = কারেন্টডেট.সেটমন্ট () -12; var অতীত তারিখ = নতুন তারিখ (২০১১, কারেন্টমন্ট, 01); সতর্কতা (pastDate); এটি কাজ করেছে, 12 মাস যাচাই করা হয়েছে
KeenUser

এটি একটি অসুস্থ উত্তর ... আমি 2012,0,15 কোথা থেকে পাব? একটি বিদ্যমান মাসে -1 রূপান্তর?
অ্যালেক্স জি

3
@ অ্যালেক্সজি - আপনি যদি জাভাস্ক্রিপ্টের তারিখ পার্সিংয়ের ক্ষেত্রে নতুন হন তবে আমি দেখতে পারি যে আমার দ্রুত উদাহরণটি বিভ্রান্তিকর হবে। জাভাস্ক্রিপ্ট কয়েক মাস শূন্য ভিত্তিক হিসাবে প্রকাশ করে, যেখানে জানুয়ারি শূন্য। এ জাতীয় বিভ্রান্তি এড়াতে, বিশেষত যেহেতু প্রশ্ন বা আমার উত্তরটির সাথে এর কোনও সম্পর্ক নেই, তাই আমি স্ট্রিং থেকে তারিখ পেতে আমার ডেমো আপডেট করেছি, যা আরও স্বজ্ঞাত হওয়া উচিত।
গিলি 3

7
আমি জানি এটি পুরানো তবে যদি তারিখটি ৩১ শে মার্চ হয় এবং আপনি এই পদ্ধতিটি ব্যবহার করে এক মাস বিয়োগ করেন ফলাফল ২ শে মার্চ। jsfiddle.net/atamata/rvumf7dg
আতামত

@ আটমাতা - হ্যাঁ, এটি অদ্ভুত, তবে অনুমানযোগ্য এবং প্রত্যাশিত। মার্চের আগের মাসের শেষের ৩১ দিন পরে ৩১ শে মার্চ, তবে ফেব্রুয়ারির জন্য এটি ২ শে মার্চ you
গিলি

28

আমি মোমেন্ট.জেস নামে একটি লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি।

এটি ভালভাবে পরীক্ষিত, ক্রস ব্রাউজারে এবং সার্ভারের পক্ষে কাজ করে (আমি এঙ্গুলার এবং নোড প্রকল্পগুলিতে উভয়ই ব্যবহার করছি)। এটিতে স্থানীয় তারিখের জন্য দুর্দান্ত সমর্থন রয়েছে।

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format()আইএসও 8601 ফর্ম্যাটে ফর্ম্যাটেড তারিখের স্ট্রিং প্রতিনিধিত্ব করে। আপনি এটির মতো কাস্টম তারিখের ফর্ম্যাটটি ব্যবহার করতে পারেন:.format('dddd, MMMM Do YYYY, h:mm:ss a')


10

একটি "একটি লাইনার" (সহজে পড়ার জন্য অনেক লাইনে)) সরাসরি কোনও ভেরিয়েবলের মধ্যে রাখতে হবে:

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);

চমৎকার! এটি প্রতিটি দৃশ্যে প্রযোজ্য কিনা তা নিশ্চিত নন, তবে যথেষ্ট পরিমাণে কাজ করছে বলে মনে হচ্ছে।
ডেভিল ফিল্ডস

8

জিনিসগুলি সত্যই সহজ করার জন্য আপনি জাভাস্ক্রিপ্টের জন্য তারিখ লাইব্রেরি ডেটজেএস ব্যবহার করতে পারেন:

http://www.datejs.com/

আপনার জন্য উদাহরণ কোড:

Date.today().add({ months: -1 });

8

এটি সংযোজন / বিয়োগফল পরিচালনা করতে পারে, কেবল বিয়োগ করতে একটি নেতিবাচক মান এবং যোগ করার জন্য একটি ধনাত্মক মান রাখে। এটি মাসের ক্রসওভার সমস্যাও সমাধান করে।

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}

6

setMonthগিলিলি দ্বারা প্রদত্ত পদ্ধতিটি যদি আপনি সন্ধান করছেন না, তবে বিবেচনা করুন:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

যে কোনও সময়ের জন্য ব্যবহার করা যেতে পারে, ঠিক সঠিক গুণক নির্ধারণ করুন।


আমি গিলি 3 এর উত্তর সঙ্গে যেতে হবে। আপনার প্রতি মাসে সেকেন্ডের একটি নির্দিষ্ট সংখ্যা ধরে নেওয়া হয়। জাভাস্ক্রিপ্টের লেন্সিয়েন্ট ডেট গাণিতিক দিনটি সঠিক রাখবে। ২৮ সেপ্টেম্বর এর তিন মাস পূর্বে জুলাই ২৮ হতে হবে
রায় টাল

1
আমি ভাবছি যে জাভাস্ক্রিপ্টটি 31 মার্চ বিয়োগ 1 মাস হতে গণনা করবে।
নাইট দ্য ডার্ক আবসোল

1
সেক্ষেত্রে আপনি মার্চ 3 (2011 এর জন্য) পান কারণ 31 ফেব্রুয়ারী এটাই হালকা মোডে রয়েছে। তবে 2 মাস বিয়োগ করুন এবং আপনি 31 জানুয়ারী পাবেন month প্রতি মাসে মডেলটির 28-দিনের অধীনে আপনি তা পাবেন না। Dateশ্রেণীটি যতটা দুর্বল , ততই ডেট.জেস পছন্দ হয়, এটি কমপক্ষে একটি লেনেন্ট প্রলেপটিক ক্যালেন্ডার মডেল করে যা নৈমিত্তিক ব্যবহারের জন্য যথেষ্ট।
রায় তোয়াল

আপনার একাধিক সেকেন্ডে 1000 থেকে সঠিকভাবে হওয়া উচিত নয় setTime()?
ভ্লাদ টেপলেভ

4

গিলি 3 এর উত্তরের সরলতাটি আমি পছন্দ করি তবে ব্যবহারকারীরা সম্ভবত অবাক হয়ে যাবেন যে ৩১ শে মার্চের এক মাস আগে ৩ মার্চ is আমি একটি সংস্করণ প্রয়োগ করেছি যা মাসের শেষের দিকে আটকে থাকে, তাই ২৮ শে মার্চ, ২৯, ৩০, এর এক মাস আগে, এবং 31 ফেব্রুয়ারি 28 এ হবে যখন এটি কোনও লিপ বছর নয় ap

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');


2

ইতিমধ্যে একটি মার্জিত উত্তর আছে তবে আমি দেখতে পাচ্ছি যে এটি পড়তে খুব শক্ত তাই আমি নিজের ফাংশনটি তৈরি করেছি। আমার উদ্দেশ্যগুলির জন্য আমার নেতিবাচক ফলাফলের প্রয়োজন হয়নি তবে এটি সংশোধন করা কঠিন হবে না।

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }


1

এটি সবচেয়ে ছোট এবং সহজতম কোড।

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

ভেরিয়েবল ঘোষণা করুন যার বর্তমান তারিখ রয়েছে। তারপরে ঠিক সেটমুন্থ ইনবিল্ট ফাংশনটি ব্যবহার করে আমরা 3 মাস পিছনের তারিখ পেতে পারি।


-1

আমার ক্ষেত্রে আমার 1 মাসের বর্তমান তারিখ থেকে বিয়োগ করা দরকার। গুরুত্বপূর্ণ অংশটি ছিল মাসের নম্বর, সুতরাং আপনি চলতি মাসের কোন দিনটিতে ছিলেন তা যত্নশীল নয়, গত মাসে আমার দরকার ছিল। এটি আমার কোড:

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

1 মাসের প্রকৃত তারিখের বিয়োগ এটি সঠিক নয়, এ কারণেই আমি প্রথম স্থানে আমি মাসের প্রথম দিন নির্ধারণ করি (যে কোনও মাসের প্রথম দিন সর্বদা প্রথম দিন) এবং দ্বিতীয় স্থানে আমি 1 দিন বিয়োগ করি যা সর্বদা আপনাকে সর্বশেষ মাসে পাঠায়। আপনাকে সাহায্য করার আশা করি বন্ধু।

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)



-1

একটি জেএস তারিখ অবজেক্ট এবং আপনি কত মাস যুক্ত / বিয়োগ করতে চান তার একটি পূর্ণসংখ্যা পাস করুন। monthsToAddইতিবাচক বা নেতিবাচক হতে পারে। একটি জেএস তারিখের অবজেক্ট প্রদান করে।

যদি আপনার originalDateObject31 শে মার্চ হয় এবং আপনি -1 পাস করেন monthsToAddতবে আপনার আউটপুট তারিখটি 28 ফেব্রুয়ারি হবে।

আপনি যদি প্রচুর মাস কেটে যান, 36 বলুন, এটি বছরের অ্যাডজাস্টমেন্টটিও সঠিকভাবে পরিচালনা করবে।

const addMonthsToDate = (originalDateObject, monthsToAdd) => {
  const originalDay = originalDateObject.getUTCDate();
  const originalMonth = originalDateObject.getUTCMonth();
  const originalYear = originalDateObject.getUTCFullYear();

  const monthDayCountMap = {
    "0": 31,
    "1": 28,
    "2": 31,
    "3": 30,
    "4": 31,
    "5": 30,
    "6": 31,
    "7": 31,
    "8": 30,
    "9": 31,
    "10": 30,
    "11": 31
  };

  let newMonth;
  if (newMonth > -1) {
    newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
  } else {
    const delta = (monthsToAdd * -1) % 12;
    newMonth = originalMonth - delta < 0 ? (12+originalMonth) - delta : originalMonth - delta;
  }

  let newDay;

  if (originalDay > monthDayCountMap[newMonth]) {
    newDay = monthDayCountMap[newMonth].toString();
  } else {
    newDay = originalDay.toString();
  }

  newMonth = (+newMonth + 1).toString();

  if (newMonth.length === 1) {
    newMonth = '0' + newMonth;
  }

  if (newDay.length === 1) {
    newDay = '0' + newDay;
  }

  if (monthsToAdd <= 0) {
    monthsToAdd -= 11;
  }

  let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;

  let newTime = originalDateObject.toISOString().slice(10, 24);

  const newDateISOString = `${newYear}-${newMonth}-${newDay}${newTime}`;

  return new Date(newDateISOString);
};

-5
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:

   <!DOCTYPE html>
<html>
<body>

<p>Click the button to display the date after changing the month.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {

var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);

OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate()  )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);

}

    document.getElementById("demo").innerHTML = d;
}
</script>

</body>
</html>

ইতিমধ্যে উপস্থিত 7 টি, বেশ পুরানো উত্তরগুলির চেয়ে এই উত্তরটি কীভাবে আলাদা?
স্টিফেন রাউচ

-5

var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);

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