文出处: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(,,); // A friday
var friday_plus_two_working_days = friday.AddWorkingDays(); // friday + 2 working days Assert.IsTrue(friday_plus_two_working_days == friday.AddDays());
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 == ); 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().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);
}

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

最新文章

  1. Android Retrofit 2.0 使用-补充篇
  2. sqlserver2000 在查询时产生序号列的办法
  3. 2016年iOS技术圈回顾
  4. 高度30px,宽度自适应,点线在文字中间
  5. unix环境C编程之日期时间转换
  6. android 有时候stroke不起作用
  7. git 用户手册
  8. jquery attr处理checkbox / select 等表单元素时的坑
  9. bzoj2243[SDOI2011]染色 树链剖分+线段树
  10. 阶段01Java基础day25网络编程
  11. XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
  12. 使用python脚本实现iOS图片资源压缩
  13. Nginx配置中的log_format用法梳理(设置详细的日志格式)
  14. MySQL 性能管理及架构设计指南
  15. phpmyadmin登录提示mysqli_real_connect(): (HY000/2002): No such file or directory和mysql8登录失败的问题
  16. PTA 7-1 整数分解为若干项之和(20 分)
  17. node.js 在使用child_process 模块时候,调试端口占用的问题解决方案(EADDRINUSE)
  18. 分享几个.NET 下的计划任务组件
  19. Java Web 热部署
  20. C# GDI+开发手记

热门文章

  1. Android--使用Canvas绘图
  2. yum源的相关事项
  3. [转] Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装、配置
  4. 安装python官方的mysql库“mysql-connector-python”
  5. 是时候放弃sublime了
  6. Spring3系列12- Spring AOP AspectJ
  7. ORACLE查看并修改最大连接数
  8. CSS - DIV标签width根据内容自适应
  9. git 在提交之前撤销add操作
  10. 使用 Portable Class Library(可移植类库)开发 Universal Windows App