当前位置: 首页 > 面试题库 >

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

邓俊材
2023-03-14
问题内容

我正在尝试计算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;
}

问题答案:

伪代码解决方案可能类似于以下内容。

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


 类似资料:
  • 问题内容: 我想计算两个给定日期之间的工作日数。例如,如果我要计算2013年1月10日至2013年1月15日之间的工作日,则结果必须为3个工作日(我没有考虑该间隔中的最后一天,因此我减去了周六和周日)。我有以下适用于大多数情况的代码,除了我的示例中的代码。 我该怎么做?我需要整天检查一下吗?还是有一个简单的方法来做到这一点。 问题答案: 请,请使用日历表。SQL Server对国定假日,公司活动,

  • 问题内容: 如果我有两个日期,我该如何使用JavaScript以分钟为单位获取两个日期之间的差额? 问题答案: 您可以签出以下代码: 或舍弃秒,如果您不想舍入分钟。

  • 问题内容: 我有两个这样的表: 表格1 表2 我想从 Table1中 选择并插入 Table2中 。 例如: 在表1中,我有这个 在表2中,我想要这个 带有样本数据的表结构 问题答案: 感谢您的架构。它使处理您的问题变得容易。我对您的架构进行了一些更改以利用auto_increment 在这里,我在emp_leave_daywise表上添加了唯一约束,因为id整数上的主键不能确保记录不重复。 em

  • 问题内容: 我想要一个开始日期和结束日期之间的日期列表。 结果应为所有日期的列表,包括开始日期和结束日期。 问题答案: 一次添加一天直到达到结束日期: 实现自己的迭代器也可以做到这一点并不难,那就更好了。

  • 问题内容: 如何计算SQL Server中两个日期之间的工作日数? 星期一至星期五,它必须是T-SQL。 问题答案: 对于周一至周五的工作日,您可以使用单个SELECT进行操作,如下所示: 如果要包括假期,则必须进行一些调整…

  • 问题内容: 在MySql数据库中有表 我的问题是,我要传递开始日期和结束日期,然后我将获得列日期,例如: 那么我将获得101,102,103 UserId的值。但是我出错了 问题答案: 这可能会更好: 也可能是保留字,对此不太确定。如果是这种情况,则您需要在其周围加反引号(前后应有一个`)