Расчет праздников - PullRequest
       7

Расчет праздников

1 голос
/ 22 декабря 2010

Количество праздников перемещается из года в год.Например, в Канаде день Виктории (он же выходные два-четыре мая) - это понедельник до 25 мая, или День благодарения - второй понедельник октября (в Канаде).

Я использовал варианты этого запроса Linq, чтобы получить дату выходного дня для данного года:

var year = 2011;
var month = 10;
var dow = DayOfWeek.Monday;
var instance = 2;

var day = (from d in Enumerable.Range(1,DateTime.DaysInMonth(year,month))
let sample = new DateTime(year,month,d)
where sample.DayOfWeek == dow
select sample).Skip(instance-1).Take(1);

Хотя это работает и достаточно легко понять, я могупредставьте себе, что есть более элегантный способ сделать этот расчет по сравнению с этим методом грубой силы.

Конечно, это не касается праздников, таких как Пасха и многие другие лунные даты.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

И это становится сложным, если вы рассматриваете нехристианские праздники. Например, еврейские праздники основаны на еврейском календаре.

Может быть, не так элегантно, но более подвержено ошибкам - вы можете просто добавить таблицу всех соответствующих праздников на следующие 100 лет.

0 голосов
/ 22 декабря 2010
int margin = (int)dow - (int)new DateTime(year, month, 1).DayOfWeek;
if (margin < 0) margin = 7 + margin; 
int dayOfMonth = margin + 7*(instance - 1) //this is for 0-based day number, add 1 if you need 1-based. instance is considered to be 1-based

Обратите внимание, что я написал это, не пытаясь скомпилировать, поэтому это должно дать идею, но может потребовать некоторой очистки. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...