在Java中获取两个工作日之间的分钟数

wmomyfyw  于 2022-12-25  发布在  Java
关注(0)|答案(3)|浏览(138)

我正在用Java计算两个Joda DateTime或Calendar之间的分钟数。当然,如果我可以使用Minutes.minutesBetween函数,这将变得很简单,但是我只能计算工作日和上午8:00-下午6:00之间的分钟数。
例如:
开始日期:2015年3月11日16:00
结束日期:2015年3月11日17:00
这很简单,因为它正好是60分钟,因为这是一个工作日,并且在给定的工作时间之间。
现在我想计算的是:
开始日期:2015年3月11日17:00
结束日期:2015年3月12日09:00
这应该返回120分钟,即使两个日期之间的分钟数要多得多,因为两个日期之间只有两个工作小时。
有时候两次约会之间还有一个周末,那些分钟也不应该加进去。
我一直在不懈地努力落实这一点,但我还没有找到解决办法。
有什么想法吗?
先谢了。
编辑:多亏了Davis Broda的伪代码,我找到了一个解决方案:

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;
}
2nc8po8w

2nc8po8w1#

伪码解决方案可能看起来如下所示。

onSameWorkDay?

    if yes
        simple date comparison
    if no
        days = find number of whole work days between the two dates
        dayToMin = days * 8 * 60
        minDay1 = find minutes between specified start time and end of day1
        minDay2 = find minutes between start of final day and specified end time
        totalTime = dayToMin + minDay1 + minDay2
rfbsl7qr

rfbsl7qr2#

我想寻找这个问题解决方案的人会发现这个回购协议很有用:https://github.com/ansshuman/silversurfer
具体来说,这个java代码文件:https://github.com/ansshuman/silversurfer/blob/main/src/com/github/ansshuman/timesurfer/TimeSurfer.java
它的方法“public Long calculateWorkingTimeInMillis(Date start,Date end)”计算两个日期之间的工作时间。程序的时间和空间复杂度都是O(1)。使用旧的日期和日历API,但工作正常

j5fpnvbx

j5fpnvbx3#

在迄今为止的最新Java版本中,使用LocalDateTime更容易。

相关问题