मैं आज से तीन महीने पहले जावास्क्रिप्ट में तारीख की गणना कैसे करूं?


147

मैं एक तारीख बनाने की कोशिश कर रहा हूं जो वर्तमान तारीख से 3 महीने पहले है। मुझे वर्तमान महीना नीचे दिए गए कोड से मिलता है

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

क्या आप लोग मुझे इस बात पर विचार करने के लिए तारीख ( Dateडेटा प्रकार का एक ऑब्जेक्ट ) बनाने के लिए तर्क दे सकते हैं कि जब जनवरी जनवरी (1) है, तो तारीख से 3 महीने पहले OCtober (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 महीने को कैसे परिभाषित करते हैं? तीस दिन? अधिकांश लोग कहेंगे कि एक महीने पहले का मतलब महीने के उसी दिन है, जो पिछले महीने के उद्धरण के लिए आवश्यक है । लेकिन आधे से ज्यादा समय, यानी ३१ दिन पहले, ३० नहीं। और अगर आज ३१ वां महीना है (और यह अगस्त या डेसिमेबर नहीं है), तो उस महीने का दिन पिछले महीने में मौजूद नहीं है।

दिलचस्प बात यह है कि यदि आप यह पूछते हैं कि Google किसी दिन से एक महीने पहले क्या है, तो आप जावास्क्रिप्ट से सहमत हैं :

'31 मार्च से पहले एक महीने' के लिए Google खोज परिणाम '3 मार्च' को दिखाता है

यह भी कहता है कि एक महीना 30.4167 दिन लंबा होता है : । दिनों में एक महीना ’के लिए Google खोज परिणाम 430 .4167’ दिखाता है

तो, 31 मार्च से एक महीने पहले, 28 मार्च से एक दिन पहले, 3 दिन पहले? यह सब इस बात पर निर्भर करता है कि आप "एक महीने पहले" से क्या मतलब है। जाओ अपने उत्पाद के मालिक के साथ एक बातचीत है।

यदि आप ऐसा करना चाहते हैं जैसे मोमेंट्स करते हैं, और महीने के आखिरी दिनों की इन त्रुटियों को महीने के आखिरी दिन तक ले जाकर ठीक करते हैं, तो आप ऐसा कुछ कर सकते हैं:

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

यदि आपकी आवश्यकताएं इससे अधिक जटिल हैं, तो कुछ गणित का उपयोग करें और कुछ कोड लिखें। आप एक डेवलपर हैं! आपको लाइब्रेरी स्थापित करने की आवश्यकता नहीं है! आपको stackoverflow से कॉपी और पेस्ट नहीं करना है! आप अपने आप को ठीक वही करने के लिए कोड विकसित कर सकते हैं जिसकी आपको आवश्यकता है!


var currentDate = new date (); var currentMonth = currentDate.getMonth () -12; var pastDate = नई तिथि (2011, वर्तमान माह, 01); चेतावनी (pastDate); यह काम किया, 12 महीनों के साथ जाँच की
किन्नर

यह एक बीमार जवाब है ... मुझे 2012,0,15 कहां से मिलेगा? एक मौजूदा महीने में परिवर्तित करें -1?
एलेक्स जी

3
@ एलेक्स जी - यदि आप जावास्क्रिप्ट तिथि पार्स करने के लिए नए हैं, तो मैं देख सकता हूं कि मेरा त्वरित उदाहरण कैसे भ्रमित होगा। जावास्क्रिप्ट महीनों को शून्य आधारित के रूप में व्यक्त करता है, जहां जनवरी शून्य है। इस तरह के भ्रम से बचने के लिए, खासकर जब से सवाल या मेरे जवाब से कोई लेना-देना नहीं है, मैंने स्ट्रिंग से तारीख प्राप्त करने के लिए अपना डेमो अपडेट किया है, जो अधिक सहज होना चाहिए।
gilly3

7
मुझे पता है कि यह पुराना है, लेकिन अगर तारीख 31 मार्च है और आप इस विधि का उपयोग करते हुए एक महीना घटा देते हैं तो परिणाम 2 मार्च है। jsfiddle.net/atamata/rvumf7dg
atamata

@ तमाता - हाँ, यह अजीब है, लेकिन उम्मीद के मुताबिक और अपेक्षित है। मार्च के लिए पिछले महीने के अंत के 31 दिन बाद 31 मार्च है, लेकिन फरवरी के लिए यह 2 मार्च है। यदि आप महीने के अंत से गिनती करना चाहते हैं, तो आपको उसके लिए कुछ कस्टम कोड लिखना होगा।
गिली ३ २०'१

28

मैं Moment.js नामक एक पुस्तकालय का उपयोग करने की सलाह देता हूं।

यह अच्छी तरह से परीक्षण किया गया है, क्रॉस ब्राउज़र और सर्वर साइड पर काम करता है (मैं इसे दोनों कोणीय और नोड परियोजनाओं में उपयोग कर रहा हूं)। इसमें लोकल डेट्स के लिए काफी सपोर्ट है।

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

चीजों को वास्तव में सरल बनाने के लिए आप DateJS, जावास्क्रिप्ट के लिए एक तिथि पुस्तकालय का उपयोग कर सकते हैं:

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

यदि setMonthgilly3 द्वारा दी गई विधि वह नहीं है जो आप ढूंढ रहे हैं, तो विचार करें:

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".

किसी भी राशि के लिए इस्तेमाल किया जा सकता है, बस सही गुणक सेट करें।


मैं gilly3 के उत्तर के साथ जाऊंगा। आपका प्रति माह एक निश्चित संख्या में सेकंड मानता है। जावास्क्रिप्ट की उदार तारीख अंकगणित दिन को सही रखेगा। 28 सितंबर से पहले के तेरह महीने 28 जुलाई होने चाहिए।
रे तोल

1
मुझे आश्चर्य है कि जावास्क्रिप्ट मार्च 31 वें शून्य से 1 महीने की गणना करेगा।
नीट द डार्क एबसोल

1
उस स्थिति में आपको 3 मार्च (2011 के लिए) मिल जाता है क्योंकि 31 फरवरी का दिन लीनियर मोड में होता है। लेकिन 2 महीने घटाएं और आपको 31 जनवरी मिल जाएगी। 28 दिन प्रति माह मॉडल के तहत आप नहीं करेंगे। Dateवर्ग जितना कमजोर होता है, और जितना Date.js को पसंद किया जाता है, यह कम से कम मॉडल एक उदार प्रोलेप्टिक कैलेंडर है जो आकस्मिक उपयोग के लिए पर्याप्त है।
रे तोल

क्या आपको सही ढंग से 1000 से कई सेकंड नहीं चाहिए setTime()?
व्लाद त्सेप्लेव

4

मुझे gilly3 के उत्तर की सादगी पसंद है , लेकिन उपयोगकर्ताओं को शायद आश्चर्य होगा कि 31 मार्च से एक महीने पहले 3 मार्च है। मैंने एक संस्करण लागू करने के लिए चुना जो महीने के अंत तक रहता है, इसलिए 28 मार्च, 29, 30 से एक महीने पहले, और 31 को सभी 28 फरवरी को होंगे जब यह लीप वर्ष नहीं होगा।

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

वह परिवर्तनशील चर जिसकी वर्तमान तिथि है। तो बस setMonth इनबिल्ट फंक्शन का उपयोग करके हम 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

JS दिनांक ऑब्जेक्ट और कितने महीनों के पूर्णांक को आप जोड़ना / घटाना चाहते हैं। monthsToAddसकारात्मक या नकारात्मक हो सकता है। JS दिनांक ऑब्जेक्ट लौटाता है।

यदि आपका 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 अन्य, काफी पुराने उत्तरों से अलग कैसे है?
स्टीफन राउच

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.