2014-02-26 45 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"); 
}