作者MOONRAKER (㊣企業號OGC-1701)
看板Visual_Basic
標題Re: [VBA ] 計時器Timer
時間Thu Sep 2 15:55:51 2010
※ 引述《xu3jp68 (信箱爆炸..XD)》之銘言:
: ◆ From: 122.124.175.52
: → MOONRAKER:timer每到午夜歸零。
: → xu3jp68:不好意思,所以我該怎麼改才可以知道實際的時間呢?
: → xu3jp68:如果跑不到1天,可以從-33XXX反推回去求解時間嗎?
這個你畫一畫數線不就知道了
考慮程式開始執行時取一次 timer 為 t1 , 結束時再取一次為 t2
t1 t2
▏ ▏
 ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
這樣當然 t2 - t1 就得到程式執行時間 (elapsed time) 。
但是中間如果跨到午夜,程式結束時的日時間 (day time) 又小於開始時的日時間
那 t2 - t1 就會得到負值:
t1
00:00 t2
▏ ▏ ▏
 ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
daytime 20:00 03:00
t2 - t1 = 10800 - 72000 = -61200
而正確的執行時間從上圖也很容易得出來:
t_e = 86400 - t1 + ( t2 - 0 )
= ( t2 - t1 ) + 86400
所以只要把以上「負時距」的值加上86400就是正確的執行時間。
還有一種狀況是,程式執行可能超過一天,那這時 t2 - t1 很可能得到一個
正值甚至0,連有沒有跨日都不能確認。
t1
00:00 t2
▏ ▏ ▏
 ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
daytime 22:00 22:00
解決這個問題也很簡單…記錄開始執行和結束執行時的now()就結了。你從這
兩個值可以知道中間過了多少日曆天,再依此決定 t2 - t1 要加多少秒數來
修正。
考慮程式開始執行時取一次 now() 為 n1 , 結束時再取一次為 n2
那麼
t_e = ( t2 - t1 ) + ╘ n2 - n1 ╛ * 86400
你可以直接把兩次取的 now() 相減,結果就是一個浮點數,意義為日數。當
然相減的結果還要無條件捨去取整數,要怎麼寫你自己可以查到。
--
Google 關鍵字 : MPFC-TCP / 殺人笑話 / 包租婆也有過當羅莉的時候
Youtube關鍵字 : 脫衫脫褲 / 傻蛋奧運 / 宗教審訊 / 買張床 / 單車超人 / 謳歌金錢
*美髮師登山隊 http://tinyurl.com/dm6lh3 *Ypres 1914 http://tinyurl.com/b432jb
[蒙帝派松正體中文計畫] http://www.youtube.com/user/JamesBondXD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.168.228
→ xu3jp68:感謝你,非常詳細還畫圖,連天數都思考到了,真的謝謝!! 09/02 17:19
→ MOONRAKER:其實我發現…你好像直接記錄兩次的now()然後相減乘以 09/03 15:32
→ MOONRAKER:86400就是秒數了…反正一大堆轉換都發生在最後顯示的時 09/03 15:32
→ MOONRAKER:候而已,就別計較浪費CPU time的問題了… 09/03 15:33
推 necsa:我覺得M大很強,M大是靠寫程式吃飯的嗎?? 09/03 20:30
→ MOONRAKER:本板比我強的太多了,我是匪諜。 09/04 17:09
推 WorkinChina:M大好客氣 09/07 08:07