我有一个应用程序可以在人们生病时进行登记,并在此事件发生后的特定工作日内向经理发送通知。
我可以使用 DateTime 的属性来跳过周末,但如何跳过假期?
我在某处读到教堂假期是从复活节开始计算的。但是怎么办?我如何首先找到复活节?
最佳答案
跳过日期之间的假期和计算复活节是两个不同的野兽,您可能想要前者。
您的应用程序应该维护一个假期列表,正如@GeneMyers 关于 Holidays in United States
的评论所建议的那样
有了这个列表,您可以使用如下代码:
private static void Main(string[] args)
{
var start = new DateTime(2015, 01, 01); // Thusday
var finish = new DateTime(2015, 01, 31); // Saturday
var totalDays = finish.Subtract(start).TotalDays; // 30 days
var test1 = GetWorkingDays(start, finish, false, new List<DateTime>()); // should be 30
var test2 = GetWorkingDays(start, finish, true , new List<DateTime>()); // should be 21
var test3 = GetWorkingDays(start, finish, true , new List<DateTime> // should be 19
{
new DateTime(2015, 01, 01), // New Year's Day
new DateTime(2015, 01, 09), // Random holiday
new DateTime(2015, 01, 25), // Sao Paulo city foundation, sunday
});
}
public static int GetWorkingDays(DateTime from, DateTime to,
bool skipWeekends, IEnumerable<DateTime> holidays)
{
var totalDays = (int)to.Subtract(from).TotalDays;
var isHoliday = new Func<DateTime, bool>(date =>
holidays.Contains(date));
var isWeekend = new Func<DateTime, bool>(date =>
date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday);
return Enumerable
.Range (0, totalDays + 1)
.Select(days => from.AddDays(days))
.Count (date => (!skipWeekends || !isWeekend(date)) && !isHoliday(date)) - 1;
}
关于c# - 我如何计算假期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30692597/