查看日期范围与某些其他日期范围的缺失日期

查看日期范围与某些其他日期范围的缺失日期

问题描述:

以下是我想要做的事情: 我得到的日期范围为2013年4月3日至2013年4月23日 - 这是我的主要范围。查看日期范围与某些其他日期范围的缺失日期

现在我可以创建一些自己的时间范围(例如,2013年4月4日至2013年4月4日和2013年4月4日至2013年4月23日)。那些必须覆盖整个主要范围,因此主要范围(不包括周末)的每一天都需要在我自己的时间范围内的相应日期。

我的计划是为主要范围创建一个数组。然后我检查我自己的时间范围的每一天与主要范围。如果有一个协议,我会从主要范围中删除一天。 所以最后,如果一切正常,就会有一个数组,因为所有的日子都被我自己的时间范围所覆盖。如果没有,那么未覆盖的日子仍然在主要范围内,我可以与他们合作(在本例中:03.04.2013,10.04.2013)

有没有人有更好的主意来解决这个问题? NotesDateTimeRanges?

+0

嗯 - 真的不知道什么是坏对这个疑问,someo ne给了它-1 ...并且你的回答很好,我想。不要忘记回收您的Notes对象,但... – 2013-05-03 13:40:48

+0

感谢您的注意! :) – 2013-05-06 07:21:54

我会将日期添加到sorted collection,然后是“海盗算法”。向左看,看起来是正确的,如果任何一个外观失败,你可以停止(除非你想找到所有缺失的日期)。

把我的头(可能需要按摩的最终名单存储值回):

var AbsenctSince:NotesDateTime; //Start Date - stored in the NotesItem 
var endDate:NotesDateTime; // Return, could be in Notes or Today 
var wfDoc:NotesDocument = docApplication.getDocument(); 
var responseCDs:NotesDocumentCollection = wfDoc.getResponses(); 
var docResponse:NotesDocument; 
var nextResponse:NotesDocument; 

//Get the date, which limits the function - if there is a return information, then this is the limit, else today 
AbsenctSince = wfDoc.getDateTimeValue("AbsentSince") ; 
if (wfDoc.hasItem("ReturnInformationDat")) { 
    endDate = wfDoc.getDateTimeValue("ReturnInformationDat"); 
} else { 
    endDate = session.createDateTime("Today"); 
} 

//Get all days between two dates - as pure Java! 
var dateList:java.util.List = getWorkDayList(AbsenctSince.toJavaDate(), endDate.toJavaDate()); 

// Looping once through the reponse documents 
var docResponse = responseCDs.getFirstDocument(); 
while (docResponse != null) { 
    nextResponse = responseCDs.getNextDocument(docResponse); 
    var CDValidSince:NotesDateTime = docResponse.getDateTimeValue("CDValidSince"); 
    var CDValidTill:NotesDateTime = docResponse.getDateTimeValue("CDValidTill"); 
    // Now we need get all days in this range 
    var removeDates:java.util.List = getWorkDayList(CDValidSince.toJavaDate(),CDValidTill.toJavaDate()); 
    dateList.removeAll(removeDates); 
    docResponse.recycle(); 
    docResponse = nextResponse; 
} 
// Both docs are null - nothing to recycle left 
// Now we only have uncovered dates left in dateList 

docApplication.replaceItemValue("openDates", dateList); 

// Cleanup 
try { 
AbsenctSince.recycle(); 
endDate.recyle(); 
wfDoc.recycle(); 
responseCDs.recycle(); 
} catch (e) { 
dBar.error(e); 
} 

function getWorkDayList(startDate, endDate) { 
var dates:java.util.List = new java.util.ArrayList(); 
var calendar:java.util.Calendar = new java.util.GregorianCalendar(); 
    calendar.setTime(startDate); 
    while (calendar.getTime().before(endDate)) { 
    var workDay = calendar.get(calendar.DAY_OF_WEEK); 
    if (workDay != calendar.SATURDAY && workDay != calendar.SUNDAY) { 
     var result = calendar.getTime();  
     dates.add(result); 
    } 
    calendar.add(java.util.Calendar.DATE, 1); 
    } 
    return dates; 
} 
+0

谢谢你!我将使用一些代码。 – 2013-05-05 15:02:47

+0

完成后发布您的解决方案。需要注意的事项:边缘条件 - > getWorkDayList包括最后一天或不应该(并且应该)?您可能需要将dateList内的条目转换回NotesDateTime对象 – stwissel 2013-05-06 10:37:41

我现在已经这样做了(似乎工作至今):

var dateArray = new Array(); 
var responseCDs:NotesDocumentCollection = docApplication.getDocument().getResponses(); 
var dt:NotesDateTime = session.createDateTime("Today"); 
var wfDoc = docApplication.getDocument(); 
dt.setNow(); 

//Get the date, which limits the function - if there is a return information, then this is the limit, else today 
var AbsenctSince:NotesDateTime = session.createDateTime(wfDoc.getItemValue("AbsentSince").toString().substr(0,19)); 
if (wfDoc.hasItem("ReturnInformationDat")) { 
    var endDate:NotesDateTime = session.createDateTime(wfDoc.getItemValue("ReturnInformationDat").toString().substr(0,19)); 
} else { 
    var endDate:NotesDateTime = session.createDateTime("Today"); 
} 

//Get all days between two dates 
dateArray = getDates(AbsenctSince, endDate); 

for (var i=dateArray.length-1; i >= 0 ; i--) { 
    var checkDate:NotesDateTime = session.createDateTime(dateArray[i].toString().substr(0,19)); 
    var day = checkDate.toJavaDate().getDay(); 

    //Remove weekends first 
    if ((day == 6) || (day == 0)) { //6 = Saturday, 0 = Sunday 
     dBar.info("splice: " + dateArray[i]); 
     dateArray = dateArray.splice(i,1); 
    } else { 
     var docResponse = responseCDs.getFirstDocument(); 
     //Work through all response docs to check if any date is covered 
     while (docResponse != null) { 
      var CDValidSince:NotesDateTime = session.createDateTime(docResponse.getItemValue("CDValidSince").toString().substr(0,19)); 
      var CDValidTill:NotesDateTime = session.createDateTime(docResponse.getItemValue("CDValidTill").toString().substr(0,19)); 

      //checkDate covered? If yes, it will be removed 
      if (checkDate.timeDifference(CDValidSince)/86400 >= 0 && checkDate.timeDifference(CDValidTill)/86400 <= 0) { 
       dBar.info("splice: " + dateArray[i]); 
       dateArray = dateArray.splice(i,1); 
      } 

      docResponse = responseCDs.getNextDocument(); 
     } 
    } 
} 

docApplication.replaceItemValue("openDates", dateArray); 

而且我使用此功能(从这个question here通过):

function getDates(startDate:NotesDateTime, endDate:NotesDateTime) { 
    var dateArray = new Array(); 
    var currentDate:NotesDateTime = startDate; 
    while (endDate.timeDifference(currentDate) > 0) { 
     dateArray.push(currentDate.getDateOnly()); 
     currentDate.adjustDay(1); 
    } 
    return dateArray; 
}