• 译: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);
    }

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

  • 相关阅读:
    第二章.md
    第四章.md
    第一章.md
    第九章.md
    png简析.md
    第五章.md
    好看的粒子效果
    缓动 减速运动
    收集的小效果
    粒子效果2
  • 原文地址:https://www.cnblogs.com/yplong/p/4264201.html
Copyright © 2020-2023  润新知