2015-06-07 3 views
0

У меня есть приложение, которое регистрируется, когда люди болеют, и отправляет уведомление менеджеру через определенное количество рабочих дней после этого события.Как рассчитать праздники?

Я могу использовать свойства DateTime, чтобы пропустить выходные, но как пропустить отпуска?

Я где-то читал, что церковные праздники рассчитаны на пасхальные праздники. Но как? И как мне найти пасхальное начало?

+2

Там в [Статья Википедии] (Http: //en.wikipedia.org/wiki/Computus) об этом. Но если вы хотите * все * праздники, имейте в виду, что это сильно зависит от страны и может меняться в любое время по политическим причинам. –

+1

Я думаю, что тема «Праздник» основана на проблеме глобализации/локализации/национализации. Их даты в году _can_ будут изменены или они могут быть отменены правительством или нет. –

+0

В инфраструктуре .NET нет ничего, чтобы сделать то, что я знаю. Если вы нацеливаете отдельную страну, вам, возможно, придется самостоятельно вводить и вести список праздников, если вам не посчастливилось найти веб-службу или библиотеку, которая уже делает это. Я подозреваю, что датировать Пасху будет недостаточно. –

ответ

1

Пропустив праздники между датами и расчета Пасхи два разных животных и, возможно, вы хотите, чтобы бывший.

Ваше приложение должно поддерживать список праздников, как это было предложено @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; 
} 
1

Я бы использовал таблицу известных праздников для вашей локали, а не пытался их вычислить. Например, Outlook позволяет импортировать список праздников. Помните также, что есть разница в православной Пасхе и «западной» Пасхе.

Если вы специально планируете рассчитать григорианскую Пасху, посмотрите на этот код BASIC, который вы можете легко переносить на C#, если вы все же предпочтете сделать это самостоятельно.

https://www.assa.org.au/edm#Computer

+1

Вы можете получить общедоступные календари Google. http://gmailblog.blogspot.dk/2014/02/new-holiday-calendars.html Вот XML для праздников Соединенных Штатов: https://www.google.com/calendar/feeds/en .usa% 23holiday% 40group.v.calendar.google.com/государственные/основной –