同我們從 DateTime 中將時(shí)刻部分作為 ShortTime 抽離出來(lái)一樣,我們將 DateTime 中的日期部分也抽離出來(lái),以 ESBasic.Date 類(lèi)來(lái)表示。
比如,我們的報(bào)表系統(tǒng)是以“天”為單位來(lái)進(jìn)行統(tǒng)計(jì)的,為了提高效率,我們會(huì)在每天凌晨將前一天的報(bào)表數(shù)據(jù)統(tǒng)計(jì)完畢,并存儲(chǔ)到數(shù)據(jù)庫(kù)中,一天的報(bào)表數(shù)據(jù)就對(duì)應(yīng)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)中的一條記錄,該記錄以一個(gè)表示日期的整數(shù)而不是 DateTime 作為主鍵。比如主鍵值為 20090501 的表示這條記錄對(duì)應(yīng)的是 2009 年 5 月 1 日的報(bào)表數(shù)據(jù)。
假設(shè)我想查詢(xún) 2009-05-01 到 2009-05-07 這 7 天的報(bào)表數(shù)據(jù),就沒(méi)有必要傳入 2009-05-01 00:00:00 和 2009-05-07 23:59:59 兩個(gè) DateTime 進(jìn)去, 而只要傳入兩個(gè) Date 類(lèi)型的對(duì)象即可。
相比于 DateTime ,使用 Date 來(lái)表示日期在語(yǔ)義上會(huì)更加清晰。
DateTime 的形象示意圖如下:
|
Year |
Month |
Day |
2. 適用場(chǎng)合:
任何只需要使用年月日來(lái)表示日期的場(chǎng)合。
3 .設(shè)計(jì)思想與實(shí)現(xiàn)
Date
的設(shè)計(jì)與實(shí)現(xiàn)都是相當(dāng)簡(jiǎn)單的,其類(lèi)圖如下:
Date
實(shí)現(xiàn)了
IComparable
泛型接口,表示
Date
對(duì)象之間可以相互比較。
Date
所表示的日期的值越大,則
Date
就越大。
Date 提供一個(gè)接受 DateTime 類(lèi)型的參數(shù)的構(gòu)造函數(shù),表示可以直接將一個(gè) DateTime 轉(zhuǎn)化為一個(gè) Date 對(duì)象。
Date 標(biāo)記為可序列化,表示可以通過(guò) Remoting 進(jìn)行遠(yuǎn)程傳遞 Date 對(duì)象。
ToDateInteger 方法用于將日期轉(zhuǎn)化為一個(gè)整數(shù),正如緣起中提到的,對(duì)一個(gè)表示 2009 年 5 月 1 日的 Date 對(duì)象調(diào)用 ToDateInteger 方法會(huì)返回整數(shù) 20090501 ,這個(gè)整數(shù)與示例數(shù)據(jù)庫(kù)中對(duì)應(yīng)記錄的主鍵是相等的。
如果一個(gè) Date 所代表的日期越大,則其 ToDateInteger 方法返回的整數(shù)也越大。基于這一點(diǎn),如果要查詢(xún)上述數(shù)據(jù)庫(kù)中的某日期范圍內(nèi)的報(bào)表記錄,直接對(duì)主鍵值進(jìn)行 between…and 的范圍查詢(xún)即可。
AddDays 方法表示在現(xiàn)在的日期上加上一定的天數(shù)然后返回得到的新日期。如果自己手動(dòng)來(lái)實(shí)現(xiàn)這個(gè)方法,則要考慮很多例外情況,比如大小月份、閏年的 2 月等等,所以我直接借助現(xiàn)成的 DateTime 來(lái)實(shí)現(xiàn)這個(gè)方法。
另外, Date 類(lèi)還有幾個(gè)靜態(tài)方法: ConvertFromDateInteger 方法的作用剛好與 ToDateInteger 方法相反,用于將一個(gè)整數(shù)轉(zhuǎn)化為一個(gè) Date 對(duì)象。 ConvertToDateInteger 方法可以更方便地將一個(gè) DateTime 的日期部分直接轉(zhuǎn)化為一個(gè)整數(shù)。
4. 使用時(shí)的注意事項(xiàng)
(1) Date 所代表的日期是以“一天”為遞增的,是連續(xù)的,但是其 ToDateInteger 方法返回的整數(shù)雖然也是遞增的,卻是不連續(xù)的。比如 20090531 與 20090601 之間就差了 70 。
(2)
Date
有一個(gè)接受年、月、日三個(gè)整數(shù)的構(gòu)造函數(shù),該構(gòu)造函數(shù)我沒(méi)有手動(dòng)去檢測(cè)三個(gè)參數(shù)的合法性,而是借助了
DateTime
來(lái)做這件事情,如果三個(gè)參數(shù)的取值不合理,則會(huì)
DateTime
的構(gòu)造會(huì)拋出異常。
: this ( new DateTime(y,m,d)) // 借助DateTime來(lái)驗(yàn)證參數(shù)的合法性
{
}
(3)
Date
類(lèi)的
Day
屬性的
set
方法,也是基于同(
2
)一樣的考慮,借助
DateTime
來(lái)驗(yàn)證屬性值的合法性。
5. 擴(kuò)展
我們可以將表示報(bào)表查詢(xún)的起始日期的 Date 對(duì)象和表示結(jié)束日期的 Date 對(duì)象組合成一個(gè) ESBasic.DateScope 對(duì)象,用于表示要查詢(xún)的報(bào)表的日期范圍。
如果我們要判斷某個(gè)日期是否在 DateScope 指定的日期范圍內(nèi),可以調(diào)用 DateScope 的 Contains 方法。
DateScope 對(duì)象之間很難進(jìn)行比較大小,但是可以比較是否相等,所以 DateScope 實(shí)現(xiàn)了“ == ”操作符和覆蓋的基類(lèi)的 Equals 方法。
注:ESBasic源碼可到
http://esbasic.codeplex.com/
下載。
ESBasic討論:37677395
ESBasic開(kāi)源前言
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

