(如果您能對照著源碼來閱讀本文,效果會更好。)
1. 緣起:
假設我們的員工打卡系統,需要設定公司規定的上班時間、下班時間、以及還要對員工是否遲到早退等這些情況進行判斷。
我們以什么方式來記錄類似上下班時間這樣只有時分秒沒有年月日的時間了?你說可以使用 DateTime ,但是合適嗎?總是覺得用 DateTime 來表示上下班的時間很別扭,因為我們的上下班時間并需要指定到具體的哪一天啊。
我設計了 ESBasic.ShortTime 來對類似上下班時間的概念進行抽象。 ShortTime 只有時分秒三個必需的屬性,不必再牽扯到日期。
ShortTime 的形象示意圖如下:
Hour |
Minute |
Second |
2. 適用場合:
任何只需要使用時分秒來表示時刻的場合。
3 .設計思想與實現
ShortTime
的設計與實現都是相當簡單的,其類圖如下:
ShortTime
有
Hour
、
Minute
、
Second
三個屬性,
Hour
采用
24
小時制,取值范圍為
0~23
,
Minute
和
Second
的取值范圍都是
0~59
。如果在設置這些屬性的值超過了其自身的取值范圍,屬性的
set
方法會自動將其修正到正確的值。
ShortTime 實現了 IComparable 泛型接口,表示 ShortTime 對象之間可以相互比較。 ShortTime 所表示的時刻的值越大,則 ShortTime 就越大,這是完全一致的。
ShortTime 是可序列化的,表示可以通過 Remoting 進行遠程傳遞。
ShortTime 提供了一個非常有用的方法 IsOnTime ,用于判斷是否到了指定的時刻。該方法接受兩個參數: target 和 maxToleranceInSecs , target 即是與當前對象進行比較的目標, maxToleranceInSecs 表示認為當前對象與 target 所表示的時間是同一時刻所允許的最大誤差(單位為秒)。比如, maxToleranceInSecs 取值為 3 秒,那么 22:15:00 與 22:15:02 就被認為是同一時刻, IsOnTime 方法將返回 true 。
4. 使用時的注意事項
( 1 ) ShortTime 的精度只能到秒,不能記錄毫秒、微秒等更小的精度。
( 2 ) IsOnTime 方法的 maxToleranceInSecs 參數的取值是由我們的系統需求所能允許的最大時刻誤差來決定了。比如,你的輪詢引擎是每隔 5 秒鐘檢測一次是否到了指定的時刻,那么在這種情況下 maxToleranceInSecs 參數就應該設置為 5 ,而不是更大或更小。
5. 擴展
我們可以將表示上班時間的 ShortTime 對象和表示下班時間的 ShortTime 對象組合成一個 ShortTimeScope 對象,用于表示工作時間。
ESBasic. ShortTimeScope 用來表示一個時間范圍,當然,這個范圍的最大長度為 24 小時(更準確的應該是 23 小時 59 分 59 秒),也就是說, ShortTimeScope 不能表示跨天的時間段。
如果我們要判斷某一時刻是否在 ShortTimeScope 指定的時間范圍內,可以調用 ShortTimeScope 的 Contains 方法。
ShortTimeScope 對象之間很難進行比較大小,但是可以比較是否相等,所以 ShortTimeScope 實現了“ == ”操作符。
另外,在我們后面介紹的
CircleTaskSwitcher
(循環任務切換器),它的實現也用到了本節講到的
ShortTime
。
注:ESBasic源碼可到
http://esbasic.codeplex.com/
下載。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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