2010-12-22 66 views
1

許多假期每年都會有所變動。例如,在加拿大維多利亞日(又名五月二至四周末)是五月二十五日前的星期一,或感恩節是十月的第二個星期一(在加拿大)。計算假期

我一直在使用的變化對這個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

如果你不得不考慮非基督教節日,它會變得複雜。例如,猶太節日是基於猶太人的日曆。

也許不那麼優雅,但更容易出錯 - 您可以添加一個表格,爲未來100年添加所有相關的假期。

+0

事實上,我所要做的就是 - 填充表格 - 它只是計算表格的值。 – 2010-12-22 18:39:53

0
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 

請注意,我沒有試圖編譯它,所以它是給出的想法,但可能需要一些清理。希望這可以幫助!