作者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
[蒙帝派松正体中文计画] https://www.youtube.com/user/JamesBondXD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.168.228
1F:→ xu3jp68:感谢你,非常详细还画图,连天数都思考到了,真的谢谢!! 09/02 17:19
2F:→ MOONRAKER:其实我发现…你好像直接记录两次的now()然後相减乘以 09/03 15:32
3F:→ MOONRAKER:86400就是秒数了…反正一大堆转换都发生在最後显示的时 09/03 15:32
4F:→ MOONRAKER:候而已,就别计较浪费CPU time的问题了… 09/03 15:33
5F:推 necsa:我觉得M大很强,M大是靠写程式吃饭的吗?? 09/03 20:30
6F:→ MOONRAKER:本板比我强的太多了,我是匪谍。 09/04 17:09
7F:推 WorkinChina:M大好客气 09/07 08:07