商务/假日日期处理
我正在寻找一个C#类/库,它与Perl模块Date::Manip
工作方式类似于业务/假日日期。 在Perl中使用该模块,我可以传递一个日期并查明它是工作日(即周一至周五)还是假期。 在配置文件中定义假期非常简单(参见Date::Manip::Holidays
)。 您可以输入适用于每年的“固定”日期,例如:
12/25 = Christmas
或者每年的“动态”日期,如:
last Monday in May = Memorial Day
或者给定年份的“固定”日期,例如:
5/22/2010 = Bob's Wedding
您还可以传递日期并返回下一个/上一个工作日。
有没有人知道C#世界中有类似的东西? 我发现了一些实现我需要的部分的东西( https://www.codeproject.com/KB/cs/busdatescalculation.aspx和https://www.codeproject.com/KB/dotnet/HolidayCalculator。 aspx )我可以将它们拆开并制作我需要的东西。 但如果其他人已经这样做了,为什么还要呢?
谢谢!
戴夫
Nager.Date支持超过90个国家(美国,DE,FR,RU,英国……),该库可用于.net45和.netstandard 2.0。 完整的国家/地区列表可在github页面上找到。
的NuGet
PM> install-package Nager.Date
例:
获取一年的所有公共假日
var publicHolidays = DateSystem.GetPublicHoliday("DE", 2018);
检查公共假日的日期
var date = new DateTime(2018, 01, 01); if (DateSystem.IsPublicHoliday(date, "DE")) { //Yes - New Year's Day }
派对有点晚了,但想想它会帮助其他人搜索它。 在https://geekswithblogs.net/wpeck/archive/2011/12/27/us-holiday-list-in-c.aspx上找到了一个很好的答案。 它甚至考虑到周末假期。
private static HashSet GetHolidays(int year) { HashSet holidays = new HashSet (); // 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; } }
drules项目是一个可用于生成这些规则的库。
5月的最后一个星期一是:
roll(*/5/last, -1, mon)
我找不到任何我想要的东西,所以我使用https://www.codeproject.com/KB/dotnet/HolidayCalculator.aspx中的代码并修改它以满足我的需要。 它完成了我需要的大部分工作,所以它没有做太多的调整。
如果您对广泛的国家/地区参考感兴趣。 我在考虑最初专注于银行或交换假期的QuantLib。 如果需要,您可以在C#中构建库,尽管这可能很重要。
无论如何,这是我能找到的最好的参考。
QuantLib:日历
还有这个库https://github.com/Shaenn/ID3iHoliday
你有自述文件的例子,
您也可以使用自定义语法编写自己的特定日规则,请参阅https://github.com/Shaenn/ID3iHoliday/blob/master/ID3iHoliday.Countries/ME.cs
这是支持,格列高利,朱利安,希吉和希伯来日历!
最好的问候Shaenn。
我没有看到Date :: Manip中没有任何内容作为.Net Framework的一部分提供。 这不适用于星期几吗?
DateTime dt = DateTime.Now; Console.WriteLine(dt.DayOfWeek);
Date :: Manip的描述如下:
Date :: Manip是一系列模块,旨在使任何常见的日期/时间操作变得容易。 比较两次,计算给定时间与另一次的时间或解析国际时间等操作都很容易完成。
这一切都与DateTime类一起提供。
Date::Manip
可以处理复杂的规则,例如星期五。 这是我使用的Date::Manip
holidays.cnf
文件中的星期五的定义:
1*0:0:0:0:0:0*EASTER,PD5 = Good Friday
在内部,它有逻辑来确定复活节何时基于月相。
这是一个营业时间计算器,它还处理金融机构使用的市场假期。 它会检查所有9个市场假期,您可以调整工作日或周末的营业时间。
营业时间计算器
上述就是C#学习教程:商务/假日日期处理分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1011850.html