译:Datetime类型的扩展
译文出处: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);
}
致谢:~~~~~~~~~
译:Datetime类型的扩展的更多相关文章
- 【AspNetCore】【WebApi】扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat)
扩展Webapi中的RouteConstraint中,让DateTime类型,支持时间格式化(DateTimeFormat) 一.背景 大家在使用WebApi时,会用到DateTime为参数,类似于这 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- 使用Newtonsoft.json 解决 Asp.Net MVC DateTime类型数据Json格式化问题
解决思路 众所周知,MVC中调用的微软的组件JavaScriptSerialer...,格式DateTime类型数据需要在客户端专门解. 还知道,NewtonSoft.json可以“正确”的格式化Da ...
- 解决python中转化成json的方法不能序列化datetime类型数据(转)
Python自带的json.dumps方法序列化数据时候如果格式化的数据中有datetime类型数据时候会提示错误TypeError: datetime.datetime(2012, 12, 12, ...
- 解决Entity Framework中DateTime类型字段异常
从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值 具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServe ...
- 用js解析经json序列化后的C#的DateTime类型数据
格式化日期(网上到处是),把下面的代码添加到jQuery.js文件中 //格式化日期 Date.prototype.format = function(format) { /* * eg:format ...
- Convert.ToDateTime(值),方法可以把一个值转化成DateTime类型。
例子:将日历控件的值转化成DateTime类型. DateTime beginDate = Convert.ToDateTime(this.beginCalendar.EditValue);
- 向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE('{0}','YYYY-MM-DD'))
需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字 ...
- linq查询结果datetime类型转string类型
var list = new SupplierLogic().GetSupplier(pageSize, pageIndex).Select(q => new { SupplierID = q. ...
随机推荐
- Codeforces Round #385 (Div. 2) A. Hongcow Learns the Cyclic Shift 水题
A. Hongcow Learns the Cyclic Shift 题目连接: http://codeforces.com/contest/745/problem/A Description Hon ...
- 在DataTable中执行DataTable.Select("条件")返回DataTable;
转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...
- web项目总结
web项目 Webroot下面的index.jsp页面的内容: <%@ page language="java" pageEncoding="UTF-8" ...
- awk语法
awk是一个非常棒的数字处理工具.相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理.运行效率高,而且代码简单,对格式化的文本处理能力超强.先来一个例子: 文件a,统计 ...
- Mac 下配置 SSH 免密码安全登录
Win下个人常使用 SecureCRT ,Mac 下感觉 SecureCRT 并不好使,常用 iTerm2+zsh 搭配使用.A连接B 无密码登陆,则A上面执行 ssh-keygen 一路回车,把 ~ ...
- ORACLE 10g下载地址
ORACLE 10g下载地址 oracle 下载还需要用户名我自己注册了个方便大家使用下载 密码是这个 一般不会动了 大家也不用帮我找回密码了 每次都改 也很麻烦的如果有需要可以帮我浏览下 右侧的需要 ...
- MYSQL校对规则
一.前言 有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录:有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都更新 ...
- 更新iOS Distribution Certificates
1. 鑰匙圈存取 -> 憑證輔助程式 -> 從憑證授權要求憑證 email:xxx@xxxx 得到 Blia_20140129.certSigningReques 2.進入開發帳號 憑證 ...
- mysql 分表策略
mysql单表数据量巨大时,查询性能会很差,经常遇到的是存储日志相关的数据会每天产生大量的数据. 这里提供单表拆分成多表存储的三个思路: 一,固定N张表,ID取模存储 预先创建好N张表,记录按ID取模 ...
- 游戏服务器ID生成器组件
游戏服务器程序中,经常需要生成全局的唯一ID号,这个功能很常用,本文将介绍一种通用ID生成组件.游戏服务器程序中使用此组件的场景有: 创建角色时,为其分配唯一ID 创建物品时,每个物品需要唯一ID 创 ...