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(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);
}

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

时间: 2024-11-07 07:32:13

Datetime类型的扩展的相关文章

解决python中转化成json的方法不能序列化datetime类型数据(转)

Python自带的json.dumps方法序列化数据时候如果格式化的数据中有datetime类型数据时候会提示错误TypeError: datetime.datetime(2012, 12, 12, 15, 47, 15) is not JSON serializable 搜索出来的解决方案基本都是用Django的DjangoJSONEncoder来解决,为了一个简单的办法引入Django这个大家伙实在有点不知所谓.不过这一点就体现了Django的资料多的优势了 正在下决心是否干脆下载了Djan

用js解析经json序列化后的C#的DateTime类型数据

用js解析经json序列化后的C#的DateTime类型数据 (2012-09-21 19:36:03) 转载▼ 标签: 杂谈 分类: javascript // val为经json直接序列化后的C#的DateTime类型的数据function formatTime(val) {    var re = /-?\d+/;    var m = re.exec(val);    var d = new Date(parseInt(m[0]));// 按[2012-02-13 09:09:09]的格

向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE(&#39;{0}&#39;,&#39;YYYY-MM-DD&#39;))

需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字段','YYYY-MM-DD'))转换.如下: string.Format("insert into tablename (TIME) values(TO_DATE('{0}','YYYY-MM-DD'))",now) 错误写法: string.Format("insert in

[SQL]躺着也中枪的datetime类型

写在前面 本来这个东西,我是不想在这里总结的,今天有初学者的朋友问我了,那就不得不说说了,你肯定也踩过这样的坑,没遇到,说明你运气好,编码习惯好.那还是言归正传吧.避免你中枪,还是扫一眼这篇文章吧. 一个例子 测试环境:sqlserver2012,vs2013 下面看一个简单的例子,例子非常简单,就不再写注释了.一个测试的数据表TB_UserInfo: 一个再简单不过的表,自增的id,用户名字,注册时间,从上图你也看到了,是允许为空的. 再弄一个简单的测试程序. 1 using System;

SQL server数据库中的DateTime类型出现的问题

我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经常用到的一种数据类型,而C#语言中也有DateTime类型,虽然二者都是用来描述时间的,但是它们的默认值是不同的,这点必须注意,在开发过程中,二者之间相互适应关系处理不当,可能会产生不必要的麻烦,就等于浪费时间,所以记住.举个例子看看: 创建一个windows应用程序,创建一个用户信息实体类UserInfo.代码如下: 注意的是:用户信息类中的“操作日期”属性是日期类型. 再创建一个业务操作类,UserInfoOp

Path类型的扩展方法 z

写了一个基于System.IO.Path类型方法的扩展类型,用于快速对文件系统路径进行操作.如下图: 其中有许多方法就是直接调用Path类型的静态方法.比如AppendPath方法内部会直接调用Path.Combine.这些方法就不需要再介绍了.下面看一些许多说明的方法: ToDirectory方法会把一个文件路径放到文件夹路径内并返回结果,比如: var path =@"C:\a\b\c.jpg"; Console.WriteLine(path.ToDirectory(@"

将 javascript 中的 timestamp(时间戳) 转 c# 的 datetime类型

相信很多人在工作中都会遇到需要将 timestamp(时间戳) 转换为 datetime 类型,特别是做网站开发的时候,有时候需要将前端传递过来的 timestamp 转为 datetime 类型,而在转的过程中发现了需要注意的地方. 首先先说说在 javascript 中产生 timestamp 的方式,一般有以下几种方式: var date = new Date(); //获取timestamp var timestamp1 = date.getTime(); var timestamp2

【转载】对C#DateTime的一些扩展,计算周内第一天,最后一天

/// <summary> /// DateTime的一些扩展 /// </summary> public class DateTime2 { /// <summary> /// 得到本周第一天(以星期天为第一天) /// </summary> /// <param name="datetime"></param> /// <returns></returns> public DateTim

SQL中DATE和DATETIME类型不能直接作比较

如题,今天纠结了一天的问题. 在存储过程中定义了两个datetime类型的时间,然后把这个两个时间作为where条件中一个date字段between的两个时间段,结果无论如何都不执行... 就像  update table1 set col1=2 where date1 between datetime1 and datetime2 这种. 高人勿笑,小弟记个笔记而已,总结走的弯路 -- 类型兼容性问题