private static int GetWorkingDays(DateTime day1, DateTime day2) { if (day1 == day2) { return(0); } // 算以前的工作日数 if (day2 < day1) { return(-GetWorkingDays(day2, day1)); } DayArray dayArray = GetWorkingDays(day1.Year); int index0 = dayArray.IndexOf(day1); if (index0 < 0) { index0 = ~index0; } // 跨年 if (day2.Year > day1.Year) { return(GetNextYearWorkingDays(dayArray.Length - index0 - 1, day1.Year + 1, day2)); } // 当年 int index1 = dayArray.IndexOf(day2); if (index1 < 0) { index1 = ~index1; index1--; } return(index1 - index0); }
private static DateTime GetWorkingDayBefore(DateTime day, int days) { if (days < 0) { return(GetWorkingDayAfter(day, -days)); } DayArray dayArray = GetWorkingDays(day.Year); int index = dayArray.IndexOf(day); if (index > 0) { if (index - days >= 0) { return(dayArray[index - days]); } return(GetLastYearWorkingDay(day.Year - 1, days - index - 1));//xiaoguohua:return GetLastYearWorkingDay(day.Year - 1, days - index) } index = ~index; if (index == 0) { return(GetLastYearWorkingDay(day.Year - 1, days)); } index--; if (index - days >= 0) { return(dayArray[index - days]); } return(GetLastYearWorkingDay(day.Year - 1, days - index - 1)); }
private static int GetNextYearWorkingDays(int radix, int year, DateTime day) { DayArray dayArray = GetWorkingDays(year); if (day.Year > year) { return(GetNextYearWorkingDays(dayArray.Length + radix, year + 1, day)); } int index = dayArray.IndexOf(day); if (index < 0) { index = ~index; return(radix + index); } return(radix + index + 1); }
private static DateTime GetWorkingDayAfter(DateTime day, int days) { if (days < 0) { return(GetWorkingDayBefore(day, -days)); } DayArray dayArray = GetWorkingDays(day.Year); int index = dayArray.IndexOf(day); if (index < 0) { index = ~index; } int remains = dayArray.Length - index; if (days >= remains) { // 合理假设:每年元月1日总是非工作日 return(GetWorkingDayAfter(new DateTime(day.Year + 1, 1, 1), days - remains)); } return(dayArray[index + days]); }