2013-01-13 285 views
3

端子輸出:爲什麼moment.js diff方法返回NaN?

Now: { _d: Sat Jan 13 2018 02:39:25 GMT-0400 (AST), 
     _isUTC: false, 
     _a: null, 
     _lang: false } 
Expiration Date: { _d: Wed Feb 13 2013 02:00:15 GMT-0400 (AST), 
     _isUTC: false, 
     _a: null, 
     _lang: false } 
Difference between Now and Expiration Date: NaN 

代碼:

console.log('Difference between Now and Expiration Date:', now.diff(expDate, 'months', true)); 

moment.js來源:

diff : function (input, val, asFloat) { 
      var inputMoment = this._isUTC ? moment(input).utc() : moment(input).local(), 
       zoneDiff = (this.zone() - inputMoment.zone()) * 6e4, 
       diff = this._d - inputMoment._d - zoneDiff, 
       year = this.year() - inputMoment.year(), 
       month = this.month() - inputMoment.month(), 
       date = this.date() - inputMoment.date(), 
       output; 
      if (val === 'months') { 
       output = year * 12 + month + date/30; 
      } else if (val === 'years') { 
       output = year + (month + date/30)/12; 
      } else { 
       output = val === 'seconds' ? diff/1e3 : // 1000 
        val === 'minutes' ? diff/6e4 : // 1000 * 60 
        val === 'hours' ? diff/36e5 : // 1000 * 60 * 60 
        val === 'days' ? diff/864e5 : // 1000 * 60 * 60 * 24 
        val === 'weeks' ? diff/6048e5 : // 1000 * 60 * 60 * 24 * 7 
        diff; 
      } 
      return asFloat ? output : round(output); 
     } 
+0

您是否使用了最新的moment.js?我使用的是1.7.2,它讓我回到'59'。 – robertklep

+0

是的,我正在使用1.7.2。我做了'時刻(expDate._d)',它工作。任何想法爲什麼? – crzrcn

+0

是expDate一個真正的時刻() - 生成的對象?或者你從JSON反序列化的東西? – robertklep

回答

3

從問題的意見,據我瞭解,你正試圖存儲moment實例直接進入MongoDB,然後再檢索它。

一個moment沒有直接序列化的,所以這總會引起的問題。您應該從現在開始取得ISO字符串:

var m = moment(); 
var s = m.toISOString(); // "2013-08-02T20:13:45.123Z" 

將該字符串存儲在MongoDB中。稍後,當您檢索它時,您可以從該值構建新的時刻實例。

var m = moment("2013-08-02T20:13:45.123Z"); 

如果您更喜歡更緊湊的東西,您可以使用從m.valueOf()獲得的編號。但是這並不容易閱讀或操縱。

不要使用_d領域中的意見建議。這是內在的時刻,不應該直接使用。這可能不是你所期待的。

+0

謝謝! @ matt-johnson,ISO字符串爲我工作。在使用時間戳數據來自JSON /數據庫的cordova/phonegap SDK上使用moment()diff()時出現問題。 – sputn1k

+0

@whitedeath - 不確定你的意思,但你確實可以使用其他格式。你只需要[指定格式](http://momentjs.com/docs/#/parsing/string-format/)。 –

+0

不用擔心我的評論可能會幫助別人,因爲它有助於我的上下文(移動混合 - cordova/phonegap SDK項目 - 其中數據時間戳來自JSON /數據庫響應,它在轉換時刻返回NaN() - 您的ISO字符串修正了這個,如果這是存儲)。 – sputn1k