计算假期

时间:2010-12-22 15:46:39

标签: linq algorithm date

许多假期每年都在移动。例如,在加拿大维多利亚日(也就是五月二至四周末)是5月25日之前的星期一,或者感恩节是10月的第二个星期一(在加拿大)。

我一直在使用此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 个答案:

答案 0 :(得分:2)

如果你不得不考虑非基督教假期,那就太复杂了。例如,犹太假日是基于犹太人的日历..

也许不那么优雅,但更容易出错 - 你可以在接下来的100年里添加一张所有相关假期的表格。

答案 1 :(得分: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

请注意我是在没有尝试编译的情况下编写的,所以它是提出这个想法,但可能需要一些清理。希望这有帮助!