web-dev-qa-db-ja.com

Moment.jsの月差

私はしばらくの間moment.jsを使用しており、日付の操作がはるかに簡単になりましたが、失敗している特定のケースがあり、その理由はわかりません。

今日(2013年10月31日)と2014年2月1日の差分を計算すると、完全な3か月と2つの日付の間に1日がありますが、月の差分は2に戻ります。

10月31日から1月31日までの差分は正常に機能します:3か月と0日。

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

コンソールは以下を記録します。

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

丸めないブール値としてtrueを渡すと、months diffは

monthsDiff: 2.983050847457627 

これはMoment.js.diff()のバグですか?他のすべてのテストケースはすべて正常に合格します。

37
Khain

これは The Fine Manual で説明されている「特別な処理」に関係していると思います。

同じ日付の2か月間が常に整数になるように最適化されています。

したがって、1月15日から2月15日までは、正確に1か月でなければなりません。

2月28日から3月28日までは、正確に1か月です。

2011年2月28日から2012年2月28日は、正確に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番目の例は、結果を「カレンダー月」の差に変換するだけです。

(2に切り捨てる場合は、同じページに記載されています)

43
robertklep

私は2か月間の違いを取得しようとして別のルートに行きました

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;

これは私にとって理にかなっており、瞬間がdiffでいくつかの奇妙なことをしているので、私の結果がどうなるかを明確にすることにしました。

10
MrB

Moment Libraryを使用している場合、2か月間で正しい値の差があるシンプルで簡単なソリューション

  const monthDifference =  moment(new Date(endDate)).diff(new Date(startDate), 'months', true);

EndDateに日数を追加する場合

 const monthDifference = moment(new Date(endDate.add(1, 'days'))).diff(new Date(startDate), 'months', true);
1
Gaurav verma