译文出处:http://www.codeproject.com/Articles/870939/Datetime-Extensions

本文主要针对System.DateTime类型的一系列扩展。包括不同语言环境下对节假日和工作日时间的计算。

简介:

这个开源的项目是对System.DateTime类型的一系列扩展。包括在不同语言环境下节假日和工作日的时间计算。

在许多的企业中,都有一个工作日的概念。无论是计算工作流的完成日期还是回电话,除了节假日和周末,许多企业都从一个日期来增加或减少天数的方式来定义工作日。

你可以从下面链接来下载开放的源码:https://github.com/kappy/DateTimeExtensions

背景:

一个企业的节假日或周末都受到了企业的政策和地理位置的影响,而不是同一某个经验法则来计算的。这里是通过一个DateTimeCultureInfo对象来定义工作日的。

DateTimeCultureInfo是 一个基于具体文化来处理日期的核心类。它定义了如何判断一个给出的日期是不是工作日,和两个不同日期之间的转化。

处理工作日依赖于下面2个方法:

public bool IsWorkingDay(DayOfWeek dayOfWeek)
public bool IsWorkingDay(DateTime date)

第一个方法用来确定一周内的工作日,第二个方法作为第一个的扩展,来处理节假日。

由于有多种文化的工作日,所以定义了一个Name属性。

执行这些方法都有具体的策略 IWorkingDayOfWeekStrategy和IHolidayStrategy两个接口。这样设计师为了提高扩展性。

作为辅助功能,这个类能够定位,从约定和策略来实现上述两个接口。

默认情况下,策略是从CultureInfo类来定位的。

代码的使用:

下面的例子采用了最简单的方式来使用扩展:

[Test]
public void simple_calculation() {var friday = new DateTime(2011,5,13); // A friday  var friday_plus_two_working_days = friday.AddWorkingDays(2); // friday + 2 working days
Assert.IsTrue(friday_plus_two_working_days == friday.AddDays(4));  Assert.IsTrue(friday_plus_two_working_days.DayOfWeek == DayOfWeek.Tuesday);
}

版本1.1中还有一个扩展来列出一年中的所有节假日:

IDictionary<DateTime, Holiday> AllYearHolidays(this DateTime date)

通过这个DateTime扩展,能够获得给定文化中一年的节假日。就像下面的例子:

[Test]
public void get_this_year_holidays_in_portugal() {var portugalDateTimeCultureInfo = new DateTimeCultureInfo("pt-PT");var today = DateTime.Today;var holidays = today.AllYearHolidays();Assert.IsTrue(holidays.Count == 13);foreach (DateTime holidayDate in holidays.Keys) {var holiday = holidays[holidayDate];Assert.IsTrue(holidayDate.IsWorkingDay(portugalDateTimeCultureInfo) == false, "holiday {0} shouln't be working day in Portugal", holiday.Name);}
}

目前支持的环境:

pt-PT
da-DK

pt-BR
fi-FI

en-US
is-IS

en-GB
nb-NO

fr-FR
nl-NL

de-DE
sv-SE

es-ES
es-AR

es-MX
en-AU

en-ZA
fr-CA (en-CA)

ar-SA
it-IT

en-NZ
en-GD

en-IE
sl-SL

扩展:

下面是扩展的两个要点。首先要实现自定义的IHolidayStrategy 和IWorkingDayOfWeekStrategy接口。其次是实现所有的自定义IWorkingDayCultureInfo接口。最终2个的结果应该是相同的。

下面是实现一个自定义的IHolidayStrategy接口,定义了一个今天永远是假日的方法。

public class CustomHolidayStrategy : IHolidayStrategy {public bool IsHoliDay(DateTime day) {if (day.Date == DateTime.Today)return true;return false;}public IEnumerable<Holiday> Holidays {get { return null;  }}
}[Test]
public void provide_custom_strategies() {var customDateTimeCultureInfo = new DateTimeCultureInfo() {LocateHolidayStrategy = (name) => new CustomHolidayStrategy() ,};Assert.IsTrue(DateTime.Today.IsWorkingDay(customDateTimeCultureInfo) == false);Assert.IsTrue(DateTime.Today.AddDays(1).IsWorkingDay(customDateTimeCultureInfo) == true);
}

下面这个例子定义了一个方法,能够实现一周有3天假期(即使这个具体的例子和实际生活中有所不同,轮流转多出来的一天假中会是在周末以外):

public class CustomDateTimeCultureInfo : IDateTimeCultureInfo {public bool IsWorkingDay(DateTime date) {return true;}public bool IsWorkingDay(DayOfWeek dayOfWeek) {switch (dayOfWeek) {case DayOfWeek.Sunday:case DayOfWeek.Saturday:case DayOfWeek.Friday:return false;default:return true;}}public IEnumerable<Holiday> Holidays {get {return null;}}public string Name {get { return "Hello World!"; }}
}[Test]
public void provide_custom_culture() {var customDateTimeCultureInfo = new CustomDateTimeCultureInfo();var today = DateTime.Today;var next_friday = today.NextDayOfWeek(DayOfWeek.Friday);Assert.IsTrue(next_friday.IsWorkingDay(customDateTimeCultureInfo) == false);
}

致谢:~~~~~~~~~

转载于:https://www.cnblogs.com/yplong/p/4264201.html

译:Datetime类型的扩展相关推荐

  1. 在Python中,json.jumps无法直接转译datetime类型的值

    python中,json.jumps无法直接转译datetime类型的值. 最简便的方法可以通过下面这个: json.dumps(results, indent=4, sort_keys=True, ...

  2. python时间函数详解_Python:Numpy库基础分析——详解datetime类型的处理

    原标题:Python:Numpy库基础分析--详解datetime类型的处理 Python:Numpy库基础分析--详解datetime类型的处理 关于时间的处理,Python中自带的处理时间的模块就 ...

  3. 将C#中DateTime类型转化为JavaScript中的Date类型

    将C#中的DateTime类型数据返回到前端页面时,显示的样子如下图所示: 可以用JS前端操作转化成JS的Date格式,直接上代码 : // 对Date的扩展,将 Date 转化为指定格式的Strin ...

  4. mysql数据库插入datetime_往MySQL数据库datetime类型字段中插入数据库的当前时间

    代码: StringBuilder sb = new StringBuilder(); sb.append(" insert into uosdetailfile ("); sb. ...

  5. datetime类型需要指定长度吗_你真的用对数据库了吗?

    作者:浮雷原文:https://juejin.im/post/6871969929365553165 背景 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修 ...

  6. mysql java datetime_Java向mysql数据库插入datetime类型数据实例(精)

    在Mysql数据库中日期跟时间有两种: 1.date类型,date类型也就是我们常见的储存yyyy-MM-dd类型的日期,它不能储存时间,也就是只能储存日期, 2.dateitme就是可以储存日期同时 ...

  7. 解决Python自带的json序列化工具不能序列化datetime类型数据问题

    解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...

  8. 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    问题背景: 在使用asp.net mvc 结合jquery esayui做一个系统,但是在使用使用this.json方法直接返回一个json对象,在列表中显示时发现datetime类型的数据在转为字符 ...

  9. C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法...

    C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法 原文:C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决 ...

  10. sql server 中将datetime类型转换为date,或者time

    sql server 中将datetime类型转换为date,或者time 2008年01月14日 星期一 14:46 这个转换总是记不住,用到的时候就找,现贴上来,以备查用. datetime类型转 ...

最新文章

  1. 在阿里干了 5 年招聘,这 10 条建议我必须分享给你!
  2. ajax 实时进度_如何做好项目进度管理?
  3. 移动设备将成为2014年最大的安全风险
  4. 吴恩达 coursera ML 第十一课总结+作业答案
  5. QT的QDeadlineTimer类的使用
  6. IBM计划未来四年在美聘用2000名退伍军人
  7. postgresql返回行数_怎么优化你的SQL查询?以PostgreSQL为例
  8. Maven项目启动时如何查找默认的显示页面
  9. 【C/C++】顺序容器list和vector
  10. python 微信聊天机器人_python操作微信自动发消息的实现(微信聊天机器人)
  11. 【Bash百宝箱】shell作业控制(jobs、bg、fg)
  12. android获取浏览器cookie,获取浏览器cookie
  13. Jsonp 原理简述
  14. 页面置换算法java_页面置换算法之Clock算法
  15. 如何给网页添加icon图标?
  16. 完美日记小红书社群运营:KOL的私域流量运营
  17. python开发12306抢票_如何利用 Python 实现12306抢票?
  18. 数字时代的“文艺复兴”?起底数字藏品,让人欢喜让人愁
  19. 第五届传智杯-初赛【B组-题解】
  20. 条纹噪声图片_红外图像条纹噪声消除方法

热门文章

  1. 绥化二中高考成绩查询2021,2014绥化中考
  2. java生命游戏_大神们 急求一个生命游戏的java代码 谢谢各路大神!
  3. hdoj1297Children‘s Queue(递推+大数加法)
  4. android中工厂模式应用,抽象工厂模式在android中使用
  5. es 链接mysql,用python简单实现mysql数据同步到ElasticSearch的教程
  6. 容器技术Docker K8s 29 容器服务ACK基础与进阶-弹性伸缩
  7. 极客大学产品经理训练营 产品经理新人如何落地 第0课总结
  8. 把UIView提到所有View的最前面
  9. 算法:Three sum求三个数之和
  10. android.mk 依赖关系,Android NDK学习(二):编译脚本语法Android.mk和Application.mk