黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

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

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

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

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


更多文章、技術(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ì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論