using RestSharp; namespace IRaCIS.Core.Application.Helper { #region 对接模型 public class HolidayCalendar { public string Name { get; set; } public string Version { get; set; } public string Generated { get; set; } public string Timezone { get; set; } public string Author { get; set; } public string URL { get; set; } public Dictionary> Years { get; set; } } public class HolidayYear { public string Name { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public int Duration { get; set; } public List CompDays { get; set; } public string URL { get; set; } public string Memo { get; set; } } #endregion public class HolidayHelper { /// /// github 链接:https://github.com/lanceliao/china-holiday-calender?tab=readme-ov-file  /// 接口请求参考文档:https://www.koudingke.cn/docs/zh-Hans/net-lib-docs/latest/RestSharp/Usage/Usage /// private static RestClient _client => new RestClient("https://www.shuyz.com/githubfiles/china-holiday-calender/master/holidayAPI.json"); private static HolidayCalendar _holidayCalendar { get; set; } private static List _holidays = new List(); private static List _compensatedWorkdays = new List(); static HolidayHelper() { _holidayCalendar = _client.Get(new RestRequest()) ?? new HolidayCalendar(); foreach (var year in _holidayCalendar.Years.Values.SelectMany(x => x)) { // 添加节假日到假日集合 for (DateTime date = year.StartDate; date <= year.EndDate; date = date.AddDays(1)) { _holidays.Add(date); } // 添加补班日到补班日集合 foreach (var compDay in year.CompDays) { _compensatedWorkdays.Add(compDay); } } } public static TimeSpan GetChinaWorkTimeSpan(DateTime startDate, DateTime endDate) { if (startDate > endDate) { throw new ArgumentException("结束日期必须大于或等于开始日期"); } var diffTimeSpan = endDate - startDate; // 初始化工作日数为0 int workdays = 0; // 找出在给定日期范围内的假期和补班日 var filteredHolidays = _holidays.Where(d => d >= startDate && d <= endDate).ToList(); var filteredCompensatedWorkdays = _compensatedWorkdays.Where(d => d >= startDate && d <= endDate).ToList(); // 遍历日期范围,计算工作日 注意 这里是小于 for (DateTime date = startDate.Date; date < endDate.Date; date = date.AddDays(1)) { // 判断是否为工作日 bool isWeekend = date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday; bool isHoliday = filteredHolidays.Contains(date); bool isCompensatedWorkday = filteredCompensatedWorkdays.Contains(date); // 如果是补班日,或是平日(非假期,非周末),则算作工作日 if (isCompensatedWorkday || (!isWeekend && !isHoliday)) { workdays++; } } return new TimeSpan(workdays, diffTimeSpan.Hours, diffTimeSpan.Minutes, diffTimeSpan.Seconds); } } }