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的形象示意图如下:
2.适用场合:
任何只需要使用年月日来表示日期的场合。
3.设计思想与实现
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 />--> publicDate(inty,intm,intd)
:this(newDateTime(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开源前言
分享到:
相关推荐
本人将 zhuweisky博主的博客整理成了PDF文件,以便于脱机浏览,没有经过博主的同意就这么做 实在是不好意思^-^ 现将其资料免费下载 以示对博主的尊重 源博客地址:...
.NET设计规范:约定、惯用法与模式,在.net环境下进行开发设计的经典之作,权威指导.
LiteGo:「迷你」的Android异步并发类库LiteGo是一款基于Java语言的「异步并发类库」,它的核心是一枚「迷你」并发器,它可以自由地设置同一时段的最大「并发」数量,等待「排队」线程数量,还可以设置「排队策略」...
新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。 本书提供配套光盘,内含Designing ...
NET应用架构设计原则、模式与实践.pdf NET应用架构设计原则、模式与实践.pdf
应用系统建立在此框架之上,采用构件式、可复用开发,节省开发成本,加快开发速度,在软件开发上更好的做到多快省。 适合低中高任意开发水平的开发者,可以开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后台、...
新版根据.NET Framework 3.0和3.5的新特性做了全面更新,主要关注的是直接影响框架可编程能力的设计问题。遵守这些规范对于使用.NET Framework创建高质量的应用程序至关重要。 本书提供配套光盘,内含Designing ...
博文地址:http://blog.csdn.net/csnd_ayo/article/details/72457190
5.7.4 参数数量可变的成员 147 5.7.5 指针参数 150 5.8 小结 152 第6章 为扩展性而设计 153 6.1 扩展机制 153 6.1.1 非密封类 153 6.1.2 保护成员 155 6.1.3 事件与回调函数 156 6.1.4 虚成员 ...
自己写的ado.net类库,已实现有关数据库操作的各种方法,子类只需提供数据库连接,即可调用,极大了实现了代码复用.这是我针对实际开发中经常需要重复开发数据库操作而提出的解决方案. 注意,该类实现的是关于sqlserver...
这里收集一些著名的 C/C++ 开发库、SDK、类库、可复用类与结构代码 等信息,列举它们的介绍、参考和网站链接,为各位 C/C++ 程序员和爱好者提供检索和查阅类库的方便。 下面收集的 C/C++ 类库介绍整理来源于文章:...
自从.NET推出以来,他已使用.NET帮助很多行业的用户开发了体现其商业理念的软件产品.Xin Chen是.NET和EAI方面的专家,他与Microsoft和Accenture等多家技术领先的公司合作,为它们的客户提供了优秀的解决方案....
此外,还可以创建一个新类库实现软件复用。 • 第十章介绍.NET下的数据库支持,阐述了ADO.NET的基本概念和结构,并通过示例詊细介绍C#下Web Service数据库访问的方法。 • 第十一章将在以前的基础上介绍一个...
这些规范历经.NET框架三个版本的长期开发,凝聚了数千名开发人员的经验和智慧。微软的各开发组正在使用这些规范开发下一代影响世界的软件产品。 第1章 概述 1 1.1 精心设计的框架所具备的品质 2 1.1.1 精心...
Android应用源码开发Demo,主要用于毕业设计学习。
Android应用源码开发Demo,主要用于毕业设计学习。
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——...
CRMEB-DT小程序公众号h5商城v4.0.2商业版 美妆H5模版(多端合一) 手册:https://help.crmeb.net/crmeb-v4/1863402 演示:http://demo26.crmeb.net/admin/ ...7.组件化开发,可复用,开发便捷 8.可视化编辑快速装修主页