将日期范围与 moment.js 进行比较

Compare Date range with moment.js

我正在尝试获得以下输出:

这是我的代码:

const start = "12/7/2018";
const end = "10/6/2019";

var startLease = moment(start, "MM/DD/YYYY");
var endLease = moment(end, "MM/DD/YYYY");

var array = [];
var i = 0;
var nextEnd;

while (1 == 1) {
  var nextStart = nextEnd ? (nextEnd.date() > 28 ? nextEnd : nextEnd) : nextEnd || startLease.clone().add(i, 'M');
  nextEnd = startLease.clone().add(i + 1, 'M') > endLease ? endLease : startLease.clone().add(i + 1, 'M');
  if (nextEnd.date() > 28) {
    nextEnd.subtract(1, 'days')
  } else {}

  array.push(nextEnd.diff(nextStart, 'days'));

  if (nextEnd >= endLease) {
    break;
  } else {}
  i += 1
}

console.log(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

问题: 它不是从 7th-6th 开始,而是从每个月的 7th-7th 开始。我试过 .subtract(1, 'days') 但没有输出正确的值。但是,这适用于月底。

感谢任何帮助。谢谢。

我在你的循环中添加了一些日志记录,并在一次迭代后将其切断。

你的例子只有第一个月是错误的,所以问题是你期望如果你在 2018 年 12 月 7 日上加上 1 个月,你会得到 2019 年 1 月 6 日(你实际上会得到 1 月 7 日, 2019).

我不确定导致减去一天的条件应该是什么。 nextEnd.date() 将解析为一个月中的第几天,对于您的示例,它始终小于 28。

const start = "12/7/2018";
const end = "10/6/2019";

var startLease = moment(start, "MM/DD/YYYY");
var endLease = moment(end, "MM/DD/YYYY");

var array = [];
var i = 0;
var nextEnd;

while (1 == 1) {
  var nextStart = nextEnd ? (nextEnd.date() > 28 ? nextEnd : nextEnd) : nextEnd || startLease.clone().add(i, 'M');
  console.log(nextStart);
  nextEnd = startLease.clone().add(i + 1, 'M') > endLease ? endLease : startLease.clone().add(i + 1, 'M');
  console.log(nextEnd);
  if (nextEnd.date() > 28) {
    nextEnd.subtract(1, 'days')
  } else {}

  array.push(nextEnd.diff(nextStart, 'days'));

  if (nextEnd >= endLease) {
    break;
  } else {}
  i += 1;
  break;
}

console.log(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

这对我有用:

              while(1==1){
                var nextStart = nextEnd ? nextEnd : startLease.clone().add(i, 'M');
                var tempstart = startLease.clone();
                tempstart.date(1);
                if (startLease.date() < endLease.date() && array.length == 0) {
                    i = -1;
                }
                tempstart.add(i + 1, 'M');

                var days = [31, 28, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31];
                var year = tempstart.year();
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
                    days[1] = 29;

                if (endLease.date() > days[tempstart.month()]) {
                    tempstart.date(days[tempstart.month()]);
                } else {
                    tempstart.date(endLease.date());
                }

                nextEnd = tempstart > endLease ? endLease : tempstart;

                var diff_sum = nextEnd.diff(nextStart, 'days');

                array.push (diff_sum);

                if (nextEnd >= endLease) {
                    break;
                }
                i += 1
            }