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

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
