2013-10-31 11 views
22

मैं थोड़ी देर के लिए moment.js का उपयोग कर रहा हूं, और यह तारीख मैनिपुलेशन बहुत आसान बना दिया गया है, लेकिन मेरे पास एक विशिष्ट मामला है जो असफल रहा है, और मैं क्यों नहीं देख सकता।Moment.js महीने अंतर

आज (31 अक्टूबर 2013) और 1 फरवरी 2014 के बीच अंतर की गणना करते समय, महीनों का अंतर 2 के रूप में वापस आता है, हालांकि दो पूर्ण महीनों और दो तिथियों के बीच एक दिन होता है।

31 अक्टूबर और 31 जनवरी के बीच डिफ ठीक काम करता है: 3 महीने और शून्य दिन।

periodStartDate: Thu Oct 31 2013 11:13:51 GMT+0000 (GMT) 
someDate: Sat Feb 01 2014 11:13:51 GMT+0000 (GMT) 
monthsDiff: 2 

अगर मैं बूलियन दौर के लिए नहीं के रूप में सही गुजरती हैं, महीनों diff

monthsDiff: 2.983050847457627 

यह सिर्फ पल में एक बग है है:

var mStartDate = moment([ periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate() ]); 
var mTermDate = moment([ someDate.getFullYear(), someDate.getMonth(), someDate.getDate() ]); 

console.log('periodStartDate: ' + periodStartDate); 
console.log('someDate: ' + someDate); 

// Years 
var yearsDiff = mTermDate.diff(mStartDate, 'years'); 

// Months 
var monthsDiff = mTermDate.diff(mStartDate, 'months', true); 

कंसोल निम्नलिखित लॉग करता है। js.diff()? मेरे अन्य परीक्षण मामलों में से हर एक सफलतापूर्वक पास हो जाता है।

+2

मुझे संस्करण 2.2.1 पर इसका सामना करना पड़ा - मैं इसे 2.4.0 के साथ-साथ – Khain

उत्तर

26

मुझे लगता है कि इस 'विशेष हैंडलिंग' The Fine Manual में वर्णित के रूप के साथ क्या करना है:

यह सुनिश्चित करने के लिए अनुकूलित है कि एक ही तारीख के साथ दो महीने के हमेशा पूर्णांक अलग कर रहे हैं।

तो 15 जनवरी से 15 फरवरी 15 बिल्कुल ठीक होना चाहिए।

फरवरी 28 से 28 मार्च बिल्कुल 1 महीने होना चाहिए।

फरवरी 28 2011 से फरवरी 28 2012 बिल्कुल 1 वर्ष होना चाहिए।

Moment.js इस विशेष हैंडलिंग जब 31 Jan और 31 Oct के साथ काम कर (उसी दिन होने) लागू होता है:

// 31 Oct 2013 - 1 Feb 2014 
> moment([2014, 1, 1]).diff(moment([2013, 9, 31]), 'months', true) 
2.983050847457627 

// 31 Oct 2013 - 31 Jan 2014 
> moment([2014, 0, 31]).diff(moment([2013, 9, 31]), 'months', true) 
3 

// 31 Oct 2013 - 30 Jan 2014 
> moment([2014, 0, 30]).diff(moment([2013, 9, 31]), 'months', true) 
2.967741935483871 

तो 2.98 मूल्य सिर्फ इतना है कि दूसरे उदाहरण में परिणाम बदल जाता है, सही है यह एक 'कैलेंडर महीने' अंतर।

(2 करने के लिए नीचे गोलाई के लिए के रूप में, वह भी एक ही पृष्ठ पर दस्तावेज़ीकरण किया गया है)

+1

धन्यवाद रॉबर्ट के साथ भी देख सकता हूं। लेकिन क्या यह अजीब बात नहीं है कि 30/01 की तुलना में मूल्य बढ़ जाता है (31/01 के साथ अंतर की गणना करते समय), फिर फिर से नीचे? मुझे 2.967, फिर 3, फिर 3.02 या कुछ ऐसा कुछ की उम्मीद होगी। यदि दो तिथियों के बीच 3 पूर्ण महीने हैं, तो मैं एक दिन जोड़ता हूं तो कम कैसे हो सकता है? दूसरी बात यह है कि मैं इन सब के बाद करता हूं, यह है कि मैं "एक्स महीने और वाई दिनों" तरीके में अंतर प्रदर्शित करता हूं। इसलिए...यदि 2 महीने हैं, तो मुझे 31/12 तक ले जाता है, और उसके बाद 1 फरवरी तक पहुंचने के लिए 32 दिन हैं। – Khain

+0

@ ख़ैन क्योंकि दिन का मूल्य वही है जो इसे पूरे नंबर पर मान देता है (यह "विशेष हैंडलिंग ")। अन्य तिथियों के लिए, यह क्लैंप नहीं करता है और सटीक (फ़्लोटिंग पॉइंट) मान का उपयोग करता है। – robertklep

+0

@robertklep क्या आपका मतलब पल है ([2013, 10, 31])। Diff? एक टाइपो हो सकता है? – LPG

5

मैं दो महीने

function getAbsoulteMonths(momentDate) { 
    var months = Number(momentDate.format("MM")); 
    var years = Number(momentDate.format("YYYY")); 
    return months + (years * 12); 
} 

var startMonths = getAbsoulteMonths(start); 
var endMonths = getAbsoulteMonths(end); 

var monthDifference = endMonths - startMonths; 

यह मैं समझ बना दिया है और के बीच अंतर करने की कोशिश कर एक अलग रास्ता चला गया चूंकि पल अलग-अलग चीजों के साथ कुछ अजीब चीजें कर रहा है, इसलिए मैंने यह स्पष्ट करने का फैसला किया कि मेरा नतीजा क्या होगा।

+1

नवीनतम पल लाइब्रेरी से, बस d.month() + d.year() * 12 – windmaomao

+1

क्यों 12 साल से गुणा करें? क्या यह इसके बिना एक ही परिणाम पूरा नहीं करेगा? – lrossy

संबंधित मुद्दे