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

时间:2014-09-02 05:41:24

标签: javascript date momentjs

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

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

然而,星期四到下一个星期一会很好,因为它包括一个完整的星期一 - >周日周期。

我有一个简单的约会对象

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

但我不确定从哪一开始。

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

2 个答案:

答案 0 :(得分:1)

没有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),则检查(冗余)。

答案 1 :(得分:0)

这就是我想出的。我检查星期一是在星期日之前发生的,如果不是

则返回假
  // 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;
    }