2010-09-14 30 views
24

我正在尋找一個C#類/庫的工作方式類似於Perl模塊,Date::Manip至於商業/度假日期。在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),我可以分開接他們,讓我需要什麼零件的東西。但如果其他人已經這樣做了,爲什麼又這樣做呢?

謝謝!

戴夫

+1

日期:: MANIP知道當Bob的婚禮!? – dtb 2010-09-14 14:07:21

+0

它確實如果你在配置文件中定義它! :) – DaveKub 2010-09-14 14:08:23

回答

-1

我沒有看到任何日期::是不是已經作爲.NET Framework的一部分提供MANIP。 this是否適用於一週中的某一天?

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

日期的說明:: MANIP寫着:

日期:: MANIP是一系列旨在使任何常見的日期/時間操作容易做到的模塊。諸如比較兩次,計算從另一時間開始的時間或解析國際時間等操作都很容易完成。

這一切都與DateTime類。

+0

據我所知,在.NET框架中沒有任何東西與'假期'做任何事情。我需要知道給定的日期是否是假期,假期需要能夠自定義。 – DaveKub 2010-09-14 14:15:15

+0

這只是一個列表中的日期比較。使用XmlDocument讀取自定義日期,填充列表,然後檢查它。 – Amy 2010-09-14 14:26:30

+2

我不想使用節假日的列表,他們需要動態(如我給的例子)。我正在尋找一些知道2012年勞動節(或2013年或2020年等)的哪一天,而不必將完整的明確日期放在某個列表中。 – DaveKub 2010-09-14 18:13:12

-1

Date::Manip能夠處理複雜的規則,如耶穌受難日。下面是在Date::Manipholidays.cnf文件我用的是耶穌受難節的定義:

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

在內部,它具有確定何時復活節是根據月相的邏輯。

+1

是的,但問題是要找到一個可以做'Date :: Manip'的C#庫。 – DaveKub 2012-09-13 17:25:06

2

drules project是一個庫,您可以使用它來生成這些類型的規則。

的最後一個星期一五月將是:

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

這裏是一個營業時間計算器也可以用來處理金融機構用於市場假期。它會檢查所有的9個市場假期,並且可以調整您的營業時間平日或週末。

Business Hours Calculator

17

有點遲到了,但它的身影將幫助其他人在Google上搜尋它。在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

請注意,根據您的使用情況,您可能需要考慮元旦週六時的情況。例如12/31/2010將是2011年1月1日的觀察日。 – 2017-04-25 19:51:11

+0

@FacioRatio查看底部的AdjustForWeekendHoliday方法。它需要假期的日期,如果是星期六則減去一天,如果是星期天則加一天。 – Todes3ngel 2017-04-26 19:54:50

+0

沒錯,但就我而言,由於觀察的日子有時在不同的一年,我需要解釋這一點。儘管只是告訴你一年中觀察的假期是什麼,但它對我來說非常好,謝謝! – 2017-05-01 21:51:37

10

Nager.Date支持超過70個國家(美國,德國,法國,RU,英國,...)的庫可用於.net45和.netstandard 2.0。完整的國家列表可在github頁面上找到。

的NuGet

PM> install-package Nager.Date 

例子:

獲取一年內所有的publicHolidays

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

檢查日期的公衆假期

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

如果您有興趣廣泛按國家參考。我正在考慮最初側重於銀行或交換假期的QuantLib。如果需要,您可以使用C#構建庫,儘管這可能很重要。

我的任何情況下,這是迄今爲止我能找到的最佳參考。

QuantLib: Calendars

+0

請提供問題的答案(舉例),而不僅僅是一個鏈接。 – loki 2016-12-02 11:36:02

+0

請在您的答案中發佈鏈接的主要部分。如果將來該鏈接被破壞,這個答案將是無用的 – acostela 2016-12-02 11:49:50