日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ESBasic 可復(fù)用的.NET類庫(02) -- 日期 Dat

系統(tǒng) 2191 0
1. 緣起:

同我們從 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)簡單的,其類圖如下:
ESBasic 可復(fù)用的.NET類庫(02) -- 日期 Date
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ì)拋出異常。

<!--<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來驗(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開源前言

ESBasic 可復(fù)用的.NET類庫(02) -- 日期 Date


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 灵寿县| 青岛市| 玛曲县| 松原市| 同德县| 亳州市| 彭州市| 岐山县| 吉林市| 尚志市| 万荣县| 霍林郭勒市| 五原县| 清徐县| 崇礼县| 临邑县| 武平县| 邯郸县| 新安县| 三原县| 崇明县| 肃南| 通许县| 屏东县| 龙山县| 深泽县| 乌兰察布市| 买车| 阿拉善盟| 新邵县| 元氏县| 澜沧| 凤台县| 贵阳市| 贡觉县| 梁河县| 疏勒县| 彭山县| 瓮安县| 荔浦县| 民权县|