获取天数数组

时间:2018-12-03 16:50:52

标签: javascript arrays momentjs

我正在尝试创建一个数组,其中包含两个日期之间的天数。

日期可以是任何日期,但我将使用以下内容:

Start : 11/30/2018, End: 09/30/2019
Array= [30,31,29,30....31]

我要实现的目标:

enter image description here

我尝试过的事情:

const start = "11/30/2018";
const end = "09/30/2019";

const dates = [];

const mstart = moment(new Date(start));
const mend = moment(new Date(end));

let i = 0;
while (1 == 1) {
  let nextStart = mstart.clone().add(i, 'M');
  let nextEnd = mstart.clone().add(i + 1, 'M') > mend ? mend : mstart.clone().add(i + 1, 'M');

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

  if (nextEnd >= mend) {
    break;
  }

  i += 1
}


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

除array年外,日期数组的范围从前几列的30-30到最后几列的30-29

第一种情况有效。对于第二种情况,如何使日期范围为30-29?我尝试了.subtract(1,'days'),但它没有返回正确的结果,因为我也希望日期范围也能正常工作,而不是每次都减去一天。

感谢您的帮助。谢谢。

4 个答案:

答案 0 :(得分:0)

仅供参考,那一刻有一个关于范围的官方插件(it is in their documentation),有了它,您的解决方案就会在以下几行中崭露头角:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const range = moment.range(moment(new Date("11/30/2018")), moment(new Date("09/30/2019")));
console.log(Array.from(range.by('day')).map(x => +x.format('DD')))

您可以通过最近的x.format('')等来更改想要获取日期的格式

您可以看到它working here

答案 1 :(得分:0)

像这样吗?

const start = "11/30/2018";
const end = "09/30/2019";

const dates = [];

const mstart = moment(new Date(start));
const mend = moment(new Date(end));

while (mstart.format('MM-DD-YYYY') != mend.format('MM-DD-YYYY')) {
  dates.push(mstart.format('DD'));
  mstart.add(1, 'day');
}

console.log(dates);

您可以在此处进行检查:https://jsbin.com/lufupihabe/edit?html,js,console

答案 2 :(得分:0)

要获得预期结果,请使用以下选项

  1. 再次检查结束日期是否大于28
  2. 根据该条件添加和减去天数

const start = "11/30/2018";
const end = "09/30/2019";

const dates = [];

const mstart = moment(new Date(start));
const mend = moment(new Date(end));
let nextEnd

let i = 0;
while (1 == 1) {
  let nextStart = nextEnd? (nextEnd.date() > 28 ? nextEnd.add(1, 'days') : nextEnd) : nextEnd || mstart.clone().add(i, 'M');
  nextEnd = mstart.clone().add(i + 1, 'M') > mend ? mend : mstart.clone().add(i +1, 'M');

  if(nextEnd.date() > 28){
    nextEnd.subtract(1, 'days')
  }else{
   
  }
  console.log("start-->", nextStart.format('MM/DD/YYYY'), "end--", nextEnd.format('MM/DD/YYYY'))

 

  if (nextEnd >= mend) {
    break;
  }else{
     dates.push(nextEnd.diff(nextStart, 'days'));
  }

  i += 1
}


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

codepen-https://codepen.io/nagasai/pen/LXaKKY?editors=1010

答案 3 :(得分:0)

以下代码对我有用:

  while (1 == 1) {
  let nextStart = mstart.clone().add(i, 'M');
  let nextEnd = mstart.clone().add(i + 1, 'M').subtract(1,'days') > mend ? mend : mstart.clone().add(i + 1, 'M').subtract(1,'days') ;