【问题标题】:Get minutes between two working days in Java在 Java 中获取两个工作日之间的分钟数
【发布时间】:2015-03-11 19:09:51
【问题描述】:

我正在尝试计算 Java 中两个 Joda DateTimes 或 Calendars 之间的分钟数。 当然,如果我可以使用 Minutes.minutesBetween 函数,这将很简单,但我只能计算工作日和上午 8:00 到下午 6:00 之间的分钟数。

例如:

开始日期:03-11-2015 16:00
结束日期:03-11-2015 17:00

这很简单,因为它正好是 60 分钟。因为这是工作日,并且在给定的工作时间之间。

现在我要计算的是:

开始日期:03-11-2015 17:00
结束日期:03-12-2015 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;
}

【问题讨论】:

  • 我认为您可能需要编写一些代码,或者展示您目前所拥有的。
  • 分享我想出的东西真的没有任何意义。我什至还没有接近解决方案。我花了几个小时在谷歌上搜索这件事,结果一无所获。如果解决方案很明显,那么我一定是使用了错误的关键字……在这里发帖对我来说始终是最后的手段(从我提出的极少数问题中可以看出)。

标签: java datetime jodatime


【解决方案1】:

伪代码解决方案可能如下所示。

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

【讨论】:

  • 非常感谢,这可能会让我有所收获。没有这样想过。 羞耻
  • 是的,先生,我在 20 分钟内就到了那里。感谢您的帮助,很抱歉浪费您的时间。
  • @pieterjanvh 无需道歉。你不是唯一一个在这个问题上挣扎的人。我见过其他几个人撞到同一堵墙上。这种事情基本上就是 stackoverflow 的用途。
  • 伪代码不考虑周末,但我已经找到了一个解决方案。我将使用解决方案编辑我的问题。感谢您的帮助。
  • @pieterjanvh Weekdays 只不过是这段代码的另一个迭代,用 onSameWorkWeek 替换 onSameWorkDay?和类似的替代品。我认为,如果您每天都在工作,那么这几周不会有太多麻烦,因此不值得通过插入每周处理代码来使答案变得更复杂..
【解决方案2】:

我认为寻找这个问题的解决方案的人会发现这个 repo 很有用: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)。使用旧的 Date 和 calendar api,但可以正常工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多