【问题标题】:Get an array with number of days获取包含天数的数组
【发布时间】:2018-12-03 16:50:52
【问题描述】:

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

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

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

我想要达到的目标:

我尝试过的:

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>

日期数组的范围从前几列中的30-30 到最后一列中的30-29(闰年除外)。

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

感谢任何帮助。谢谢。

【问题讨论】:

  • @ponury-kostek 我正在尝试创建一个包含日期范围之间天数的数组,而不仅仅是获取两个日期之间的总天数。
  • 那么你想要一个月的日子吗?还是计算天数?

标签: javascript arrays momentjs


【解决方案1】:

要达到预期效果,请使用以下选项

  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

【讨论】:

  • 效果很好。非常感谢!
【解决方案2】:

仅供参考,那一刻有一个关于范围的官方插件 (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

【讨论】:

    【解决方案3】:

    这样的?

    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

    【讨论】:

    • 这将增加 1 个月,但这不是我的要求。我需要它每次根据开始日期添加 1 个月。到 2 月后,会在 2 月的基础上增加 1 个月。
    【解决方案4】:

    以下代码对我有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-22
      • 2021-02-17
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      相关资源
      最近更新 更多