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