我正在尝试计算Java中两个Joda
DateTimes或Calendars之间的分钟。当然,如果我可以使用Minutes.minutesBetween函数,这将很简单,但是我只能计算工作日和8:00
AM-6:00 PM之间的分钟数。
例如:
开始日期:2015/3/11 16:00
结束日期:2015/3/11 17:00
这很简单,因为恰好是60分钟。因为这是一个工作日,且在给定的工作时间之间。
现在我要计算的是:
开始日期:2015/03/11 17:00
结束日期:2015/03/12 09:00
即使之间有更多的分钟,这也应该返回120分钟,因为两个日期之间只有两个工作小时。
有时在两个日期之间还有一个周末,也不应添加这些分钟。
我一直在不遗余力地实现这一目标,但没有找到解决方案。
有任何想法吗?
提前致谢。
编辑:感谢戴维斯·布罗达的伪代码,我找到了一个解决方案:
private static int BEGINWORKHOUR = 8;
private static int ENDWORKHOUR = 16;
public int getWorkedMinutes(){
Calendar start = (Calendar) this.startTime.clone();
Calendar end = (Calendar) this.endTime.clone();
if(start.get(Calendar.HOUR_OF_DAY) < BEGINWORKHOUR){
start.set(Calendar.HOUR_OF_DAY, BEGINWORKHOUR);
start.set(Calendar.MINUTE, 0);
}
if(end.get(Calendar.HOUR_OF_DAY) >= ENDWORKHOUR){
end.set(Calendar.HOUR_OF_DAY, ENDWORKHOUR);
end.set(Calendar.MINUTE, 0);
}
int workedMins = 0;
while(!sameDay(start, end)){
workedMins += workedMinsDay(start);
start.add(Calendar.DAY_OF_MONTH, 1);
start.set(Calendar.HOUR_OF_DAY, BEGINWORKHOUR);
start.set(Calendar.MINUTE, 0);
}
workedMins += (end.get(Calendar.MINUTE) - start.get(Calendar.MINUTE)) + ((end.get(Calendar.HOUR_OF_DAY) - start.get(Calendar.HOUR_OF_DAY))*60);
return workedMins;
}
private int workedMinsDay(Calendar start){
if((start.get(Calendar.DAY_OF_WEEK) == 1) || (start.get(Calendar.DAY_OF_WEEK) == 6)) return 0;
else return (60 - start.get(Calendar.MINUTE)) + ((ENDWORKHOUR - start.get(Calendar.HOUR_OF_DAY) - 1)*60);
}
private boolean sameDay(Calendar start, Calendar end){
if(start.get(Calendar.YEAR) == end.get(Calendar.YEAR) && start.get(Calendar.MONTH) == end.get(Calendar.MONTH) &&
start.get(Calendar.DAY_OF_MONTH) == end.get(Calendar.DAY_OF_MONTH)) return true;
else return false;
}