8

ターミナル出力:

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

2 に答える 2

5

質問のコメントから、momentインスタンスを MongoDB に直接保存し、後で取得しようとしていることが分かります。

Amomentは直接シリアル化できないため、これは常に問題を引き起こします。代わりに、その瞬間から 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コメントで提案されたフィールドは使用しないでください。これは内部的なものであり、直接使用するべきではありません。それはあなたが期待しているものではないかもしれません。

于 2013-08-02T22:17:25.820 に答える