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

系统 1766 0
1. 缘起:

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

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

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

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

DateTime 的形象示意图如下:

Year

Month

Day

2. 适用场合:

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

3 .设计思想与实现

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

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

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

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

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

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

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

4. 使用时的注意事项

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

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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 指定的日期范围内,可以调用 DateScope Contains 方法。

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


注:ESBasic源码可到 http://esbasic.codeplex.com/ 下载。
ESBasic讨论:37677395
ESBasic开源前言

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论