在Java中不考虑周末和银行假期的经过时间
时间:2020-03-06 14:21:15 来源:igfitidea点击:
我实施了一款秒表,可以很好地运行,而无需考虑不应将银行假期和周末计入总时间。我一直在寻找一些开放源代码库,可以获取经过的时间,经过一个开始时刻,一个结束时刻以及一组银行假期(不计入周末)。唯一使我更轻松的库是net.sf.jtemporal,但是我仍然需要扩大功能。
谁能告诉我是否有一些有用的库来获取所需的功能?
谢谢
解决方案
我们也只计算营业时间吗?上午9点至下午3点?还是一天24小时?
正如我在这里提到的,最好和最简单的方法可能是创建一个包含每天信息的表(从开始/银行假期开始的工作日计数等;每天一行=每年365行),然后仅使用计数功能/选择正确。
我怀疑我们能找到具体的东西。但是创建我们自己的逻辑很容易。这是一些伪代码...
private long CalculateTimeSpan(DateTime BeginDate, DateTime EndDate, ArrayList<DateTime> BankHollidays) { long ticks = 0; while (BeginDate <= EndDate) // iterate until reaching end { if ((BeginDate is holliday?) || (BeginDate is Weekend?)) skip; else ticks += (24*60*60*1000); BeginDate = BeginDate + 1 day; // add one day and iterate } return ticks; }
我们应该看看Joda Time。它是一种比Java附带的日期/时间API好得多的日期/时间API。
我认为这将是我们正在寻找的有效解决方案。它计算经过的时间(假设一个工作日有24小时),而不计算银行假期和周末的时间:
/** * Calculate elapsed time in milliseconds * * @param startTime * @param endTime * @return elapsed time in milliseconds */ protected long calculateElapsedTimeAux(long startTime, long endTime) { CustomizedGregorianCalendar calStartTime = new CustomizedGregorianCalendar(this.getTimeZone()); CustomizedGregorianCalendar calEndTime = new CustomizedGregorianCalendar(this.getTimeZone()); calStartTime.setTimeInMillis(startTime); calEndTime.setTimeInMillis(endTime); long ticks = 0; while (calStartTime.before(calEndTime)) { // iterate until reaching end ticks = ticks + increaseElapsedTime(calStartTime, calEndTime); } return ticks; } private long increaseElapsedTime(CustomizedGregorianCalendar calStartTime, CustomizedGregorianCalendar calEndTime) { long interval; long ticks = 0; interval = HOURS_PER_DAY*MINUTES_PER_HOUR*SECONDS_PER_MIN*MILLISECONDS_PER_SEC; // Interval of one day if ( calEndTime.getTimeInMillis() - calStartTime.getTimeInMillis() < interval) { interval = calEndTime.getTimeInMillis() - calStartTime.getTimeInMillis(); } ticks = increaseElapsedTimeAux(calStartTime, calEndTime, interval); calStartTime.setTimeInMillis(calStartTime.getTimeInMillis() + interval); return ticks; } protected long increaseElapsedTimeAux(CustomizedGregorianCalendar calStartTime, CustomizedGregorianCalendar calEndTime, long interval) { long ticks = 0; CustomizedGregorianCalendar calNextStartTime = new CustomizedGregorianCalendar(this.getTimeZone()); calNextStartTime.setTimeInMillis(calStartTime.getTimeInMillis() + interval); if ( (calStartTime.isWorkingDay(_nonWorkingDays) && calNextStartTime.isWorkingDay(_nonWorkingDays)) ) { // calStartTime and calNextStartTime are working days ticks = interval; } else { if (calStartTime.isWorkingDay(_nonWorkingDays)) { // calStartTime is a working day and calNextStartTime is a non-working day ticks = (calStartTime.getNextDay().getTimeInMillis() - calStartTime.getTimeInMillis()); } else { if (calNextStartTime.isWorkingDay(_nonWorkingDays)) { // calStartTime is a non-working day and calNextStartTime is a working day ticks = (calNextStartTime.getTimeInMillis() - calStartTime.getNextDay().getTimeInMillis()); } else {} // calStartTime and calEndTime are non-working days } } return ticks; }