从日期集Javascript中查找日期范围

时间:2017-03-23 21:15:09

标签: javascript angularjs typescript lodash

我知道这与此Question类似,但我在JavaScript中需要不同的结果。

我有一串这样的日期,可能不合适。 3月27日/ 2017,03 / 28 / 2017,03 / 29 / 2017,04 / 04 / 2017,04 / 05 / 2017,04 / 06 / 2017,04 / 12 / 2017,04 / 13 / 2017,04 / 2017年1月14日,2017年2月5日

日期格式为mm / dd / yyyy

我需要将其拆分为一系列日期,我可以这样做。但后来我需要遍历所有日期,如果日期已连接,那么它需要是一个日期范围。如果只有一个日期,则它将是一个日期范围。

所以我需要上述日期的结果。

[
    {'start': 03/27/2017, 'end': 03/29/2017 }, 
    {'start': 04/04/2017, 'end': 04/06/2017}, 
    {'start': 04/12/2017, 'end': 04/14/2017 }, 
    {'start': 05/02/2017, 'end': 05/02/2017}
]

我在JavaScript,Typescript,lodash,angular 1.6中使用此应用程序。

非常感谢任何帮助。

修改

我有一个弹出日历,用户可以选择多个日期。如果日期是连续的,那么这是日期范围,如果它是单个日期,那么仅此日期将是日期范围。用户需要选择所需的日期,然后将这些日期插入数据库。

1 个答案:

答案 0 :(得分:0)

Here is how I did it。我将它们转换为日期,然后进行数学计算,看看下一个日期是否大于一天。如果是,那么我停止当前日期范围并开始下一个日期范围。

let string = '03/27/2017,03/28/2017,03/29/2017,04/04/2017,04/05/2017,04/06/2017,04/12/2017,04/13/2017,04/14/2017, 05/02/2017';
  //split them and pull out any white spaces from beginning and end
  let dates = string.split(',').map(s=>{
    s = s.trim();
    let nums = s.split('/');
    let d = new Date(nums[2], nums[0], nums[1]);
    return {date:d, string: s};
  });
  let currentStart = dates[0];
  let result = [];
  for(let i = 1; i < dates.length; i++){
    let {date, string} = dates[i];
    //If last date, add range
    if(i == dates.length -1){
      console.log("hello");
      result.push({start: currentStart.string ,end: string});
    } else {
      let prevDate = dates[i-1] || currentStart; //in case prevDate is undefined
      let nextDate = dates[i+1];
      let diff = nextDate.date.getTime() - date.getTime();
      if(diff > (24 * 60 * 60 * 1000)){
        result.push({start: currentStart.string ,end: string});
        currentStart = nextDate;
      }
    }
  }

  console.log(result, 'result');