商务/假日日期处理

时间:2010-09-14 14:01:10

标签: c#

我正在寻找一个与业务/假日日期类似的Perl模块Date::Manip的C#类/库。在Perl中使用该模块,我可以传递一个日期并查明它是一个工作日(即周一至周五)还是假日。在配置文件中定义假期非常简单(参见Date::Manip::Holidays)。您可以输入适用于每年的“固定”日期,例如:

12/25                           = Christmas
每年的

或'动态'日期,如:

last Monday in May              = Memorial Day
某一年的

或'固定'日期,如:

5/22/2010                       = Bob's Wedding

您还可以传递日期并返回下一个/上一个工作日。

有没有人知道C#世界中有类似的东西?我发现了一些实现我需要的部分的东西(http://www.codeproject.com/KB/cs/busdatescalculation.aspxhttp://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx),我可以将它们分开并制作我需要的东西。但如果其他人已经这样做了,为什么还要这样做呢?

8 个答案:

答案 0 :(得分:28)

Nager.Date支持超过90个国家/地区(美国,德国,法国,法国,英国,...),该库可用于.net45和.netstandard 2.0。完整的国家/地区列表可在github页面上找到。

<强>的NuGet

PM> install-package Nager.Date

示例:

获取一年的所有publicHolidays

var publicHolidays = DateSystem.GetPublicHoliday(2018, CountryCode.DE);

检查公共假日的日期

var date = new DateTime(2018, 01, 01);
if (DateSystem.IsPublicHoliday(date, CountryCode.DE))
{
    //Yes - New Year's Day
}

答案 1 :(得分:21)

派对有点晚了,但想想它会帮助其他人搜索它。在http://geekswithblogs.net/wpeck/archive/2011/12/27/us-holiday-list-in-c.aspx找到了一个很好的答案。它甚至考虑到周末假期。

private static HashSet<DateTime> GetHolidays(int year) 
    { 
        HashSet<DateTime> holidays = new HashSet<DateTime>();

        // New Years
        DateTime newYearsDate = AdjustForWeekendHoliday(new DateTime(year, 1, 1)); 
        holidays.Add(newYearsDate); 

        // Memorial Day -- last monday in May 
        DateTime memorialDay = new DateTime(year, 5, 31); 
        DayOfWeek dayOfWeek = memorialDay.DayOfWeek; 
        while (dayOfWeek != DayOfWeek.Monday) 
        { 
            memorialDay = memorialDay.AddDays(-1); 
            dayOfWeek = memorialDay.DayOfWeek; 
        } 
        holidays.Add(memorialDay); 

        // Independence Day
        DateTime independenceDay = AdjustForWeekendHoliday(new DateTime(year, 7, 4)); 
        holidays.Add(independenceDay); 

        // Labor Day -- 1st Monday in September 
        DateTime laborDay = new DateTime(year, 9, 1); 
        dayOfWeek = laborDay.DayOfWeek; 
        while(dayOfWeek != DayOfWeek.Monday) 
        { 
            laborDay = laborDay.AddDays(1); 
            dayOfWeek = laborDay.DayOfWeek; 
        } 
        holidays.Add(laborDay);

        // Thanksgiving Day -- 4th Thursday in November 
        var thanksgiving = (from day in Enumerable.Range(1, 30) 
                       where new DateTime(year, 11, day).DayOfWeek == DayOfWeek.Thursday 
                       select day).ElementAt(3); 
        DateTime thanksgivingDay = new DateTime(year, 11, thanksgiving); 
        holidays.Add(thanksgivingDay);

        // Christmas Day 
        DateTime christmasDay = AdjustForWeekendHoliday(new DateTime(year, 12, 25)); 
        holidays.Add(christmasDay); 

        // Next year's new years check
        DateTime nextYearNewYearsDate = AdjustForWeekendHoliday(new DateTime(year + 1, 1, 1));
        if (nextYearNewYearsDate.Year == year)
        holidays.Add(nextYearNewYearsDate);

        return holidays; 
    }

    public static DateTime AdjustForWeekendHoliday(DateTime holiday) 
    { 
        if (holiday.DayOfWeek == DayOfWeek.Saturday) 
        { 
            return holiday.AddDays(-1); 
        } 
        else if (holiday.DayOfWeek == DayOfWeek.Sunday) 
        { 
            return holiday.AddDays(1); 
        } 
        else 
        { 
            return holiday; 
        } 
    }

答案 2 :(得分:2)

drules project是一个可用于生成这些规则的库。

五月的最后一个星期一是:

roll(*/5/last, -1, mon)

答案 3 :(得分:1)

我找不到任何我想要的东西,所以我使用了http://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx中的代码并对其进行了修改以满足我的需求。它完成了我所需要的大部分工作,因此不需要太多调整。

答案 4 :(得分:0)

如果您对广泛的按国家/地区参考感兴趣。我在考虑最初专注于银行或交换假期的QuantLib。你可以在C#中构建库,如果必要的话可能很重要。

无论如何,这是我能找到的最佳参考资料。

QuantLib: Calendars

答案 5 :(得分:-1)

我没有在Date :: Manip中看到任何内容尚未作为.Net Framework的一部分提供。 this不适用于星期几吗?

DateTime dt = DateTime.Now;
Console.WriteLine(dt.DayOfWeek);

Date :: Manip的描述如下:

  

Date :: Manip是一系列模块,旨在使任何常见的日期/时间操作变得容易。比较两次,计算给定时间与另一次的时间,或解析国际时间等操作都很容易。

这都是DateTime类。

答案 6 :(得分:-1)

Date::Manip可以处理复杂的规则,例如星期五。以下是我使用的Date::Manip holidays.cnf文件中星期五的定义:

1*0:0:0:0:0:0*EASTER,PD5    = Good Friday

在内部,它有逻辑来确定复活节何时基于月相。

答案 7 :(得分:-1)

这是一个营业时间计算器,它还处理金融机构使用的市场假期。它会检查所有9个市场假期,您可以调整工作日或周末的营业时间。

Business Hours Calculator