// 计算时间之间的距离 // parameters: // calendar 工作日历。如果为null,表示函数不进行非工作日判断。 // return: // -1 出错 // 0 成功。timeEnd在工作日范围内。 // 1 成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间 public static int GetTimeDistance( Calendar calendar, string strUnit, DateTime timeStart, DateTime timeEnd, out long lValue, out DateTime nextWorkingDay, out string strError) { lValue = 0; strError = ""; nextWorkingDay = DateTime.MinValue; int nRet = DateTimeUtil.RoundTime(strUnit, ref timeStart, out strError); if (nRet == -1) return -1; nRet = DateTimeUtil.RoundTime(strUnit, ref timeEnd, out strError); if (nRet == -1) return -1; bool bInNonWorkingDay = false; // 看看末端是否正好在非工作日 if (calendar != null) { bInNonWorkingDay = calendar.IsInNonWorkingDay(timeEnd, out nextWorkingDay); nRet = DateTimeUtil.RoundTime(strUnit, ref nextWorkingDay, out strError); if (nRet == -1) return -1; } TimeSpan delta; delta = timeEnd - timeStart; if (strUnit == "day") { lValue = (long)delta.TotalDays; } else if (strUnit == "hour") { lValue = (long)delta.TotalHours; } else { strError = "未知的时间单位 '" + strUnit + "'"; return -1; } if (bInNonWorkingDay == true) { Debug.Assert(nextWorkingDay != DateTime.MinValue, ""); return 1; } return 0; }
// 测算还书日期 // parameters: // calendar 工作日历。如果为null,表示函数不进行非工作日判断。 // timeStart 借阅开始时间。GMT时间 // timeEnd 返回应还回的最后时间。GMT时间 // return: // -1 出错 // 0 成功。timeEnd在工作日范围内。 // 1 成功。timeEnd正好在非工作日。nextWorkingDay已经返回了下一个工作日的时间 public static int GetReturnDay( Calendar calendar, DateTime timeStart, long lPeriod, string strUnit, out DateTime timeEnd, out DateTime nextWorkingDay, out string strError) { strError = ""; timeEnd = DateTime.MinValue; nextWorkingDay = DateTime.MinValue; // 正规化时间 int nRet = DateTimeUtil.RoundTime(strUnit, ref timeStart, out strError); if (nRet == -1) return -1; TimeSpan delta; if (strUnit == "day") delta = new TimeSpan((int)lPeriod, 0, 0, 0); else if (strUnit == "hour") delta = new TimeSpan((int)lPeriod, 0, 0); else { strError = "未知的时间单位 '" + strUnit + "'"; return -1; } timeEnd = timeStart + delta; // 正规化时间 nRet = DateTimeUtil.RoundTime(strUnit, ref timeEnd, out strError); if (nRet == -1) return -1; bool bInNonWorkingDay = false; // 看看末端是否正好在非工作日 if (calendar != null) { bInNonWorkingDay = calendar.IsInNonWorkingDay(timeEnd, out nextWorkingDay); nRet = DateTimeUtil.RoundTime(strUnit, ref nextWorkingDay, out strError); if (nRet == -1) return -1; } if (bInNonWorkingDay == true) { Debug.Assert(nextWorkingDay != DateTime.MinValue, ""); return 1; } return 0; }