彭顯鋒 韋仕麗 李冬梅
摘 要:對于大多數(shù)單位而言,每天需要完成的工作很多,時常會因漏辦事務(wù)而對工作造成影響。已有的一些如鬧鐘、備忘錄等工具,很難滿足實(shí)際工作的需要。設(shè)計一個功能較為完善的事務(wù)提醒程序很有必要。該文以一個功能較為全面的事務(wù)提醒程序編制為例,從程序功能設(shè)計、實(shí)現(xiàn)的過程、具體編程方法等方面,詳細(xì)介紹了用Vb.net實(shí)現(xiàn)事務(wù)提醒的思路和編程方法,對于相似類型的事務(wù)提醒程序的編制有一定的參考價值。
關(guān)鍵詞:Vb.net 實(shí)現(xiàn) 事務(wù)提醒 方法
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1674-098X(2015)08(c)-0059-03
目前,對于大多數(shù)單位而言,每天需要完成的工作很多,時常會因漏辦事務(wù)而對工作造成影響。由于事務(wù)類型繁多,提醒周期也不盡相同,已有的一些如鬧鐘、備忘錄等工具,很難滿足實(shí)際工作的需要。因此,設(shè)計一個功能較為完善的事務(wù)提醒程序很有必要。
該文以一個功能較為全面的事務(wù)提醒程序編制為例,介紹用Vb.net實(shí)現(xiàn)事務(wù)提醒的思路和編程方法。
1 程序功能概述
程序能對節(jié)假日(包括法定和自定義節(jié)假日)、24節(jié)氣、自定義事務(wù)等進(jìn)行提醒。對于自定義任務(wù),還能按周期,如“僅一次、每天、每周、每月、每年”等進(jìn)行重復(fù)提醒,并可設(shè)置再次提醒時間。程序運(yùn)行主界面如“圖1”所示。
2 提醒功能的實(shí)現(xiàn)
2.1 “萬年歷”的制作
萬年歷是實(shí)現(xiàn)節(jié)假日(包括法定公農(nóng)歷節(jié)假日、自定義節(jié)假日等)提醒的基礎(chǔ)。
本程序建立了一個“公——農(nóng)歷轉(zhuǎn)換”的類,以公歷日期為參數(shù),通過該類可計算出相對應(yīng)的農(nóng)歷日期、星期、節(jié)假日日期、天干地支、星座等。主要實(shí)現(xiàn)方法如下。
2.1.1 公歷節(jié)假日的獲取
(1)定義如下數(shù)組并進(jìn)行初始化:
Dim sFtv() As Object={1,1,“元旦”,3,8,“婦女節(jié)”,3,23,“世界氣象日”}
其中:每個節(jié)日為3個元素,分別表示月、日和節(jié)日名。按此規(guī)律可加入自定義的節(jié)假日。
(2)下面的代碼可取得數(shù)組中定義的節(jié)假日月、日及節(jié)假日名稱。
Private SolarHolidayInfo()As SolarHolidayStruct
Private Structure SolarHolidayStruct
Dim Month As Integer
Dim Day As Integer Dim HolidayName As String
End Structure
‘取得節(jié)假日月、日及名稱
Dim b As Integer= UBound(sFtv) + 1
ReDim SolarHolidayInfo(b /3) ‘為數(shù)組重新分配存儲空間
For i=0To(b/3)-1
SolarHolidayInfo(i).Month = sFtv(i*3)‘月數(shù)
SolarHolidayInfo(i).Day = sFtv(i * 3 + 1)‘日數(shù)
SolarHolidayInfo(i).HolidayName = sFtv(i * 3 + 2)‘節(jié)假日名稱
Next
(3)用公歷的月、日數(shù)分別與SolarHolidayInfo(i).Month、SolarHolidayInfo(i).Day對比,如果相同,SolarHolidayInfo(i).HolidayName即為相應(yīng)日的公歷的節(jié)假日名稱。
2.1.2 農(nóng)歷節(jié)假日的獲取
定義如下數(shù)組并進(jìn)行初始化:
Dim lFtv() AsObject ={1,1,“春節(jié)”,1,15,“元宵”,5,5,“端午”,8,8, “苗族風(fēng)情節(jié)”}
先將公歷日期通過“公——農(nóng)歷轉(zhuǎn)換”類,得到相應(yīng)的農(nóng)歷日期。同前述“公歷節(jié)假日的獲取”方法,便可得到相應(yīng)日的農(nóng)歷的節(jié)假日名稱。
2.2 “24節(jié)氣”日期的計算
我國的萬年歷以紫金山天文臺發(fā)布的為標(biāo)準(zhǔn),通過公式法計算出的24節(jié)氣日期與標(biāo)準(zhǔn)日期有時會相差一天。為了與標(biāo)準(zhǔn)萬年歷一致,本軟件先將標(biāo)準(zhǔn)萬年歷中的24節(jié)氣日期存入數(shù)據(jù)庫(圖2),采用查表法得到24節(jié)氣的日期。
2.3 本程序中與日期、時間運(yùn)算相關(guān)的主要方法
2.3.1 日期、時間大小的比較
將需要比較的兩個日期、時間值轉(zhuǎn)化為24小時制的String類型,再用比較運(yùn)算符直接比較。此方法可以比較任意精度的日期、時間。例如:如下代碼能將當(dāng)前日期轉(zhuǎn)化為24小時制的String類型:
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”)
2.3.2 日期、時間加減
使用下面Date對象的方法可以實(shí)現(xiàn)日期、時間的加減運(yùn)算:AddYears, AddMonths, AddDays, AddHours, AddMinutes, AddSeconds, AddMilliseconds。
例:DateTime.Now.AddDays(x)‘當(dāng)前日期加x天(x可正可負(fù),負(fù)時為減)
DateTime.Now.AddHours(-x) ‘當(dāng)前日期減x小時
2.3.3 日期、時間差計算
DateDiff 函可以取得兩個日期的間隔,并且可以用年、月、日等單位傳回兩個日期的差距,語法為: DateDiff(間隔參數(shù), 日期一, 日期二)
間隔參數(shù)為: DateInterval.Year (年)DateInterval.Quarter (季)
DateInterval.Month(月)DateInterval.Day(日)
DateInterval.Week(周) DateInterval.Hour(時)
DateInterval.Minute (分) DateInterval.Second (秒)
2.4 “節(jié)假日、24節(jié)氣”提醒功能的實(shí)現(xiàn)
2.4.1“節(jié)假日”提醒
日歷中節(jié)假日較多,但并不是每個節(jié)假日均有提醒的必要。因此,可先將需要提醒的節(jié)假日存入一個表(圖3)。
(1)以當(dāng)前日期為初始參數(shù),調(diào)用“公——農(nóng)歷轉(zhuǎn)換”類,如果未返回節(jié)假日名稱、或返回的節(jié)假日不在“需要提醒的節(jié)日”表中,則日期加一天,再調(diào)用“公——農(nóng)歷轉(zhuǎn)換”類,直至返回最近的“需要提醒”的節(jié)假日名稱。
(2)查詢“節(jié)日再次提醒時間表”(圖4),如果記錄中的“節(jié)日名稱”與返回的需要提醒的公、農(nóng)歷節(jié)假日名稱均不相同,則刪除相關(guān)記錄,并直接進(jìn)行提醒。否則,如果有與返回的節(jié)假日名稱相同的記錄,并且當(dāng)前時間大于或等于“再次提醒時間”,則進(jìn)行提醒。
(3)計算出最近的“需要提醒”的節(jié)假日與當(dāng)前日相差天數(shù),進(jìn)行倒計時提醒,并允許設(shè)置“下次提醒時間”(圖5)。
2.4.2“24節(jié)氣”提醒
(1)從“24節(jié)氣表”中讀取“節(jié)氣日期”大于或等于當(dāng)前日期、并且小于或等于當(dāng)前日期加18天(因兩個節(jié)氣的日期間隔不可能大于18天)的節(jié)氣名稱,即為當(dāng)前需要提醒的節(jié)氣名稱。
(2)提醒方式以及“下次提醒時間”的設(shè)置與“節(jié)假日提醒”相同。
2.5 “自定義任務(wù)”提醒功能的實(shí)現(xiàn)
(1)任務(wù)登記:根據(jù)任務(wù)周期對需要提醒的任務(wù)進(jìn)行登記,生成任務(wù)表(圖6)。
(2)定時對任務(wù)表進(jìn)行查詢,按“提醒類型”對每條記錄進(jìn)行處理,以確定是否進(jìn)行提醒。
(3)“僅一次”提醒的實(shí)現(xiàn),①查詢“任務(wù)表”,如果當(dāng)前日期大于任務(wù)日期,則刪除該條任務(wù)記錄,不再提醒。②如果已經(jīng)設(shè)置了“下次提醒時間”,則當(dāng)當(dāng)前時間大于或等于“下次提醒時間”,才進(jìn)行提醒。否則,當(dāng)當(dāng)前日期大于或等于任務(wù)日期,就進(jìn)行提醒。進(jìn)行提醒時,可設(shè)置“下次提醒時間”。
(4)“每天”提醒的實(shí)現(xiàn),查詢?nèi)蝿?wù)表中相關(guān)任務(wù)是否在“下次提醒時間”中設(shè)置了“當(dāng)日不再提醒”,如已設(shè)置,則不作任何操作,否則,如果當(dāng)前時間大于或等于下次提醒時間,則進(jìn)行提醒。
(5)“每周、每月、每年”提醒的實(shí)現(xiàn),此類提醒功能的實(shí)現(xiàn),與“每天”提醒的方法基本相同,主要是根據(jù)日期進(jìn)行對比,確定是否需要提醒。但要注意的是:每個月的天數(shù)不完全相同。如果“每月或每年”提醒日期的號數(shù)大于相應(yīng)月的總天數(shù),運(yùn)算時應(yīng)予處理,否則會出現(xiàn)錯誤。當(dāng)提醒日期的號數(shù)大于相應(yīng)月總天數(shù)時,一般默認(rèn)提醒日期為月末。
3 結(jié)語
該文介紹了事務(wù)提醒程序編制的一些思路和編程方法,對于相似類型的事務(wù)提醒程序的編制有一定的參考價值。由于作者思維和知識面的局限,定有欠妥和不足之處,望各位同行提出寶貴意見。
參考文獻(xiàn)
[1] Bill Sheldon,Billy Hollis.NET 4.5與Visual Basic 2012高級編程[M].7版.北京:清華大學(xué)出版社,2014.
[2] 邵峰晶,于忠清,韓靜海,等.VB.NET程序設(shè)計[M].北京:電子工業(yè)出版社,2011.