基于微控制器的倒計時算法與實現
( 2)到參考時間點的時間差算法
該算法有兩個重點, 一是參考時間點的選取, 二是根據閏年規則對時間差中的天數進行補償。
關于參考時間點的選取, 應符合兩個原則: 一是方便閏年的計算, 二是方便時間差的計算。在這里,選取2001年1月1日0時0分0秒為參考時間點。
圖1是時間點到該參考時間點算法的示例代碼,pT mi e是指向時間點的數據結構指針, pResult是指向時間差的數據結構指針。下面對該段代碼逐條說明。
圖1 天數時間差參考代碼
圖1- 1定義了一個數組, 它的12個元素對應1月份到12月份所累積的天數。請注意兩點, 一是該天數不包括本月份的天數, 二是二月份的天數按28天計。
圖1- 2是計算時間點與參考時間點的年份、月份與日期的差值。
圖1- 3 是初步計算天數差。在這里應用到了圖1- 1定義的數組與圖1- 2的計算結果。首先,按照每年365天來計算天數, 再按照閏年個數補償天數, 最后按月份日期的差值計算本年度過的天數。
代碼中的( Y earId /4) 就是初步的閏年補償計算, 補償規則就是把年份差被4整除的值視為經過的閏年個數, 也就是要補償的天數。
圖1- 4是根據世紀年(也就是能被100整除的年份)的閏年判斷規則對圖1- 3的計算結果進行校正。這是因為圖1- 3 進行的閏年補償計算所依據的是非世紀年的閏年判斷規則, 這一規則在判斷世紀年是否為閏年時可能會產生誤差。在這里, 對該步驟算法采用了條件編譯, 這是考慮到該計算牽涉到真正的多字節除法, 比較耗時, 設計者可以根據實際需要決定是否運行該計算。
圖1- 5是判斷時間點的年份是否閏年, 進而進行最后的天數調整。請注意, 在圖1- 3與圖1- 4的計算中, 只計算了度過的年份中包含了多少個閏年, 這其中不包含時間點本身的年份。在本計算中,先調用函數判斷時間點年份是否閏年, 再根據時間點的月份是否超過2月決定是否對天數進行補償。
圖1 - 6是記錄時間差結果。因為參考時間點的時分秒選擇的是0時0分0秒, 所以時間差的時分秒也就是時間點的時分秒。
圖2是閏年判斷函數的參考代碼。該函數提供了兩種判斷計算, 一種是關于閏年規則的完整判斷,即當年份不能被100整除時, 能被4整除的是閏年;當年份能被100整除時, 必須能被400 整除才是閏年。另一種是簡易判斷, 即把能被4整除的年份視為閏年(當然, 該判斷只在年份不能被100整除時才正確)。這兩種計算的復雜程度與應用條件不同, 設計者應根據實際需要自行選擇。
圖2 閏年檢測函數參考代碼
請注意, 如果參考時間點選擇的不是2001年1月1日0時0分0秒, 則上述算法需要進行適當調整。
( 3)時間差相減算法時間差相減算法的主要處理方法是按時間規則進行借位相減。
圖3 是完整的時間差借位相減的參考代碼, 其前提是時間差中的天數差不為0。代碼中pT im e0是指向目標時間點與參考時間點的時間差數據結構的指針, pT ime1是指向當前時間點與參考時間點的時間差數據結構的指針。
評論