日期范围是否包含两个特定日期

Does a date range contain two specfic days

本文关键字:日期 是否 范围 范围是 包含两      更新时间:2023-09-26

我正在使用moment.js,并试图弄清楚所提供的日期范围是否至少包括一整周,而周的定义是包括周一到下周日。

例如。如果日期范围包括周三到周三,我需要返回false,因为它没有周一到周日的样本。

然而,星期四到下一个星期一也可以,因为它包括一个完整的星期一->星期日周期。

我有一个简单的日期对象

Object {
    start: "2014-03-31T13:00:00.000Z", 
    end: "2014-04-09T13:59:59.999Z"
}

但我真的不确定从哪里开始。

该项目使用的是moment.js,但如果有一个使用直接javascript日期对象的更简单的解决方案,我可以接受。

如果没有moment.js,这可能是一个想法:

//assuming you have an object like
// { start: [a date object], end: [a date object] }
// create a range (getDates.call([the assumend object]);
function getDates() {
     var dates = [{date: this.start, day: this.start.getDay()}]
        ,current = new Date(this.start);
    while (current < this.end) {
      var next = new Date(current.setDate(current.getDate()+1));
      dates.push( {date: current, day: current.getDay()} );
      current = next;
    }
    return dates;
}
// assuming you have a range, check if the range 
// contains a full week 
// (containsFullweek.call([the range]))
function containsFullweek() {
    return this.length>6 &&
           this.filter(
              function (v) { return v.day == 0 || v.day == 1})
                .length>=2;
}
// the sunday after a monday modification
function containsFullweek() {
  var mondays = this.range.filter(function (v) { return v.day == 1; })
     ,nextsundays = this.range.filter(
         function(v) {return v.day==0 && v.date>this[0].date}, mondays);
   return nextsundays.length>0;
}

jsFiddle中完成

换句话说:创建一个对象数组[范围],其中包含从开始日期到结束日期的所有日期,数组中的每个对象都存储该日期和该日期的工作日。通过检查[范围]中是否至少有七个日期来检查该范围是否包含完整的一周,如果该范围包含星期日(0)或星期一(1),则检查(多余)。

这就是我想到的。我检查星期一是否发生在星期天之前,如果不是,则返回false

  // check that a valid week range has been provided for showing Daily Profile
    function validWeekRange(){
        var day = 24*60*60*1000; // hours*minutes*seconds*milliseconds
        var diffDays = Math.round(Math.abs((new Date($scope.date.start).getTime() - new Date($scope.date.end).getTime())/(day)));
        if(diffDays >= 13){
            return $scope.validWeek=true; 
        }
        //if we got here, this date range is possibly invalid
        var mondayToSunday=[];
        var checkDate = new Date();
        var startDate = new Date($scope.date.start).getDate();
        //run through each day. the monday comes first, so if a monday is not in Monday to sunday, don't add the sunday. 
        for(var i=0; i<diffDays; i++){
            checkDate.setDate(startDate+1);
            if(checkDate.getDay()===1){
                mondayToSunday.push(i);   
            }
            if(checkDate.getDay()===0 && mondayToSunday.length>0){
                mondayToSunday.push(i);
            }                   
        }
       $scope.validWeek = !mondayToSunday.length <= 1;
    }