在 Java 内获取两个工作日之间的分钟数
Get minutes between two working days in Java
我正在尝试计算 Java 中两个 Joda DateTimes 或日历之间的分钟数。
当然,如果我可以使用 Minutes.minutesBetween 函数,这会很简单,但我只能计算工作日和 8:00 AM - 6:00 PM 之间的分钟数。
例如:
Startdate: 03-11-2015 16:00
Enddate: 03-11-2015 17:00
这很简单,正好是 60 分钟。因为今天是工作日,而且在给定的工作时间之间。
现在我要计算的是:
Startdate: 03-11-2015 17:00
Enddate: 03-12-2015 09:00
这应该 return 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;
}
伪代码解决方案可能如下所示。
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
我认为寻找这个问题的解决方案的人会发现这个 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)'计算两个日期之间的工作时间。该程序的时间和 Space 复杂度均为 O(1)。使用旧的日期和日历 api 但可以正常工作
我正在尝试计算 Java 中两个 Joda DateTimes 或日历之间的分钟数。 当然,如果我可以使用 Minutes.minutesBetween 函数,这会很简单,但我只能计算工作日和 8:00 AM - 6:00 PM 之间的分钟数。
例如:
Startdate: 03-11-2015 16:00
Enddate: 03-11-2015 17:00
这很简单,正好是 60 分钟。因为今天是工作日,而且在给定的工作时间之间。
现在我要计算的是:
Startdate: 03-11-2015 17:00
Enddate: 03-12-2015 09:00
这应该 return 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;
}
伪代码解决方案可能如下所示。
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
我认为寻找这个问题的解决方案的人会发现这个 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)'计算两个日期之间的工作时间。该程序的时间和 Space 复杂度均为 O(1)。使用旧的日期和日历 api 但可以正常工作