日期 Date--ESBasic 可复用的.NET类库(02)

简介: 1.缘起:     同我们从DateTime中将时刻部分作为ShortTime抽离出来一样,我们将DateTime中的日期部分也抽离出来,以ESBasic.Date类来表示。     比如,我们的报表系统是以“天”为单位来进行统计的,为了提高效率,我们会在每天凌晨将前一天的报表数据统计完毕,并存储到数据库中,一天的报表数据就对应数据库数据库中的一条记录,该记录以一个表示日期的整数而不是DateTime作为主键。

  1.缘起:

    同我们从DateTime中将时刻部分作为ShortTime抽离出来一样,我们将DateTime中的日期部分也抽离出来,以ESBasic.Date类来表示。

    比如,我们的报表系统是以“天”为单位来进行统计的,为了提高效率,我们会在每天凌晨将前一天的报表数据统计完毕,并存储到数据库中,一天的报表数据就对应数据库数据库中的一条记录,该记录以一个表示日期的整数而不是DateTime作为主键。比如主键值为20090501的表示这条记录对应的是200951日的报表数据。

假设我想查询2009-05-012009-05-077天的报表数据,就没有必要传入2009-05-01 00:00:00 2009-05-07 23:59:59两个DateTime进去, 而只要传入两个Date类型的对象即可。

相比于DateTime,使用Date来表示日期在语义上会更加清晰。

DateTime的形象示意图如下:

Year

Month

Day

 

 2.适用场合:

       任何只需要使用年月日来表示日期的场合。

 

3.设计思想与实现

Date的设计与实现都是相当简单的,其类图如下:
      
      Date
实现了IComparable泛型接口,表示Date对象之间可以相互比较。Date所表示的日期的值越大,则Date就越大。

Date提供一个接受DateTime类型的参数的构造函数,表示可以直接将一个DateTime转化为一个Date对象。

Date标记为可序列化,表示可以通过Remoting进行远程传递Date对象。

      ToDateInteger方法用于将日期转化为一个整数,正如缘起中提到的,对一个表示200951日的Date对象调用ToDateInteger方法会返回整数20090501,这个整数与示例数据库中对应记录的主键是相等的。

     如果一个Date所代表的日期越大,则其ToDateInteger方法返回的整数也越大。基于这一点,如果要查询上述数据库中的某日期范围内的报表记录,直接对主键值进行between…and的范围查询即可。

       AddDays方法表示在现在的日期上加上一定的天数然后返回得到的新日期。如果自己手动来实现这个方法,则要考虑很多例外情况,比如大小月份、闰年的2月等等,所以我直接借助现成的DateTime来实现这个方法。

     另外,Date类还有几个静态方法:ConvertFromDateInteger方法的作用刚好与ToDateInteger方法相反,用于将一个整数转化为一个Date对象。ConvertToDateInteger方法可以更方便地将一个DateTime的日期部分直接转化为一个整数。

 

4. 使用时的注意事项

(1)Date所代表的日期是以“一天”为递增的,是连续的,但是其ToDateInteger方法返回的整数虽然也是递增的,却是不连续的。比如2009053120090601之间就差了70

(2)Date有一个接受年、月、日三个整数的构造函数,该构造函数我没有手动去检测三个参数的合法性,而是借助了DateTime来做这件事情,如果三个参数的取值不合理,则会DateTime的构造会抛出异常。

        public  Date( int  y,  int  m,  int  d)
            : 
this ( new  DateTime(y, m, d))  // 借助DateTime来验证参数的合法性
        {
        }

(3)Date类的Day属性的set方法,也是基于同(2)一样的考虑,借助DateTime来验证属性值的合法性。
 

5.扩展

我们可以将表示报表查询的起始日期的Date对象和表示结束日期的Date对象组合成一个ESBasic.DateScope对象,用于表示要查询的报表的日期范围。

如果我们要判断某个日期是否在DateScope指定的日期范围内,可以调用DateScopeContains方法。

       DateScope对象之间很难进行比较大小,但是可以比较是否相等,所以DateScope实现了“==”操作符和覆盖的基类的Equals方法。

      
注: ESBasic已经开源,点击这里下载源码。
   
ESBasic开源前言

 

 

目录
相关文章
|
7月前
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
拦截|篡改|伪造.NET类库中不限于public的类和方法
|
4月前
|
C# 数据安全/隐私保护
一款实用的.NET Core加密解密工具类库
一款实用的.NET Core加密解密工具类库
|
4月前
|
存储 文字识别 C#
一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp
|
.NET 开发框架 开发工具
.NET Core类库中读取配置文件
最近在开发基于.NET Core的NuGet包,遇到一个问题:.NET Core中已经没有ConfigurationManager类,在类库中无法像.NET Framework那样读取App.config或Web.config(.NET Core中是appsetings.json)文件中的数据。
1705 0
|
XML .NET C#
.NET Framework 类库——C#命名空间大全
引用地址:https://msdn.microsoft.com/zh-cn/library/gg145045.aspx C# using引用时,不知道有哪些命名空间,这下转载收集一篇,方面查找使用。
1135 0
(干货).NET开发丰富的公共类库助你事半功倍(供下载免费使用)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/8980199  (干货).NET开发丰富的公共类库助你事半功倍(供下载免费使用)        Good company on the road is the shortest cut.(行路有良伴就是捷径)。
1141 0