Estoy usando moment.js y estoy tratando de averiguar si un rango de fechas suministrado incluye al menos una semana completa donde la definición de una semana es que incluye de lunes a domingo siguiente.

Por ejemplo. Si un intervalo de fechas incluye de miércoles a miércoles, debo devolver false, ya que no tiene una muestra de lunes a domingo.

Sin embargo, un jueves hasta el lunes siguiente estaría bien, ya que incluye un ciclo completo lunes -> domingo.

Tengo un simple objeto de fecha

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

Pero no estoy seguro de por dónde empezar con este.

El proyecto está usando moment.js, pero si hay una solución más fácil usando objetos de fecha de javascript directos, estoy bien con cualquiera de ellos.

1
pedalpete 2 sep. 2014 a las 09:41

2 respuestas

La mejor respuesta

Sin moment.js esto podría ser una idea:

//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;
}

Resuelto en este jsFiddle

En palabras: cree una matriz [rango] de objetos que contenga todas las fechas desde una fecha de inicio hasta la fecha de finalización, cada objeto dentro de la matriz almacena la fecha y el día de la semana de esa fecha. Compruebe si el rango contiene una semana completa comprobando si hay al menos siete fechas en el [rango] y (redundante) si el rango contiene los días domingo (0) o lunes (1).

1
KooiInc 2 sep. 2014 a las 07:30

Esto es lo que se me ocurrió. Compruebo que un lunes ocurre antes de un domingo y devuelvo falso si no es así

  // 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;
    }
0
pedalpete 2 sep. 2014 a las 07:00