2014-02-26 80 views
0

我正在嘗試使用c#查找營業日。我想知道是否有辦法找到美國的假期,或者我應該寫一個函數來確定日期是否是假期?假期日期約定C#

public bool isHoliday(DateTime date) 
{ 
//holiday input 
} 
+2

如果你問100位美國人在美國度假的列表,你會得到100個不同的答案。您需要定義什麼構成您的應用程序的假期。 –

+0

本網站爲此提供服務和API。我不知道他們有多好,我也沒有隸屬於他們。這只是搜索的結果http://www.timeanddate.com/services/api/ – Steve

+0

根據您的機構,並不是所有的假期都被認可。所以,你可能需要明確地定義它們。 – user1477388

回答

2

你可以利用這個例子: http://www.codeproject.com/Articles/11666/Dynamic-Holiday-Date-Calculator

在該鏈接提供的解決方案:

我們決定,這將是理想的所有規則存儲所有的 不同假期放在XML文件中,然後編寫一個類, 可以解釋這些規則並計算每個假期的正確日期。要做到這一點,我們必須將假期分成不同的 類型,這些類型的計算方式相似。以下是我們處理的 不同類型的假期和一個示例XML 配置每個:

<Holiday name="Groundhog Day"> 
    <Month>2</Month> 
    <Day>2</Day> 
</Holiday> 

<Holiday name="Tax Day"> 
    <WeekdayOnOrAfter> 
     <Month>4</Month> 
     <Day>15</Day> 
    </WeekdayOnOrAfter> 
</Holiday> 

的代碼是太多,張貼在這裏,但是這應該解決您的問題。使用該代碼並根據需要進行修改。

+0

以我的理解,它可以適合不同的機構。我對嗎? – galaxyan

+0

@galaxyan是的明確。在我提供的鏈接中,通過「Jay Muntz」閱讀這篇文章。他詳細說明他是如何解決問題的。希望這可以幫助你。 – Dayan

+0

使用XML不可能表示所有的邏輯。例如,工作日的後備時間是週末的公共假日。你可以使用這個庫進行計算,它支持回退。 https://www.nuget.org/packages/Nager.Date – live2

0

您可以使用DateTime.DayOfWeek,以確定它是否是一個週末或工作日,但沒有內置的是要確定它是否是一個公衆假期與否,如果這就是你在問什麼。

DateTime.DayOfWeek

0

我公司採用的是SQL表是公司的一個假期的所有日期,因此這將是一個簡單的單SELECT(或存儲過程)。然後有人必須維護那張桌子。如果只是你,硬編碼將非常相當。

一個主要的選擇是刮一個列出公衆假期的網站。我假設你只想要聯邦假期,所以不包括情人節。根據您的應用程序在做什麼,您可能需要能夠與標準列表分道揚standard,這就是下降的原因。

但是你這樣做的話,我會建議檢查你對源方法,包括:

只是爲了確保你有你想要什麼。

1

這是一個非常原始的例子,你可以如何使用絕對日期存儲美國假期表格。勞動節和哥倫布日將需要一點想象力,因爲它們可變日期。

class VariableHoliday 
{ 
    public string Name {get; set;} 

    public bool IsOnDate(DateTime date) 
    { 
     //logic to detect the variable dates goes here! 
    } 
} 

static readonly Dictionary<DateTime, string> m_Holidays = new Dictionary<DateTime,string> 
{ 
    { new DateTime(1,1,1), "New Years Day" }, 
    { new DateTime(1,7,4), "Independence Day" }, 
    { new DateTime(1,7,4), "Independence Day" }, 
    /*FILL OUT ALL OF THE HOLIDAYS YOU WANT TO OBSERVE*/ 
}; 

static List<VariableHolidays> m_VariableHolidays = new List<VariableHolidays>(); 

public bool isHoliday(DateTime date) 
{ 
    bool isHoliday = m_Holidays.HasKey(new DateTime(1, date.Month, date.Day)); 

    if(!isHoliday) 
     m_VariableHolidays.Any(p => p.IsOnDate(date)); 
} 

public string getHolidayName(DateTime date) 
{ 
    if(m_Holidays.HasKey()) 
     return m_Holidays[new DateTime(1, date.Month, date.Day)]; 
    else 
    { 
     var holiday = m_VariableHolidays.FirstOrDefault(p => p.IsOnDate(date)); 
     if(holiday != null) return holiday.Name 
    } 

    throw new InvalidOperationException("Date is not a holiday"); 
}