2013-12-21 36 views
0

我在窗體上有一個計時器,間隔爲1000(1秒)。我允許用戶通過三個組合框輸入時間。他們輸入的時間然後轉換爲日期時間格式。最後,如果輸入時間等於DateTime.Now,計時器會檢查每個記號。問題是它不工作。計時器在輸入匹配時沒有檢測到DateTime.Now

假設我在下午8:59:50時將鬧鐘設置爲9:00:00 PM。我點擊開始,然後等待十秒鐘,以便警報關閉,但它永遠不會。在調試代碼時,兩個數字都是相同的,這意味着它應該觸發,但它不會。

這裏是我的代碼:

private void tmrAlarm_Tick(object sender, EventArgs e) { 
    DateTime alarmTime = Convert.ToDateTime(statusAlarm.Text); // say statusAlarm.Text is 9:00:00 PM 

    if(alarmTime == DateTime.Now) { 
     MessageBox.Show("bzzt"); 
    } 
} 

有沒有實現這一點(例如,計時秒而不是檢查它是否是一個正確的時間)的一個更好的辦法?我應該用秒錶嗎?

最後,它可能會失敗,因爲計時器是在一秒開始的,而不是一開始?就像我在1.05秒開始計時,而不是在第二秒。

編輯:

我改變了代碼如下:

if(alarmTime.Hour == DateTime.Now.Hour && 
    alarmTime.Minute == DateTime.Now.Minute && 
    alarmTime.Second == DateTime.Now.Second) { ... } 

這是一個有點笨重的外觀,但它完美!

+3

DateTime.Now包含小數秒。因此在這種情況下'=='不能直接用於有用的結果。 – user2864740

+2

您需要將DateTime舍入爲秒,然後進行比較,而不是使用'==',而是使用'>'。那麼即使你沒有完成,它也可以工作 –

+0

工作正常!感謝大家! – Abluescarab

回答

2

問題是,DateTime.Now返回一個非常精確的值,小數秒。因此,您很可能永遠不會達到滿足==條件的程度。

要做你想做的事情,你必須只返回返回的DateTime(h,m,s)的'更高級別'值。

+0

我剛剛更改了檢查h/m/s的代碼,它完美地工作!謝謝! – Abluescarab

+0

很高興爲您效勞。請考慮將我的答案標爲已接受。 –

+0

我會一旦接受它。只需等待一分鐘......編輯:接受!再次感謝! – Abluescarab

0

你也可以使用

DateTime.Now.ToShortTimeString()方法檢查平等

0

你不能依賴於定時器正好在目標時間被解僱(由其他答案的建議),無論粒度。 (另外,比較舍入的時間可能會導致事件提前觸發,如果它還不是一個循環值)。

如果您輪到一秒鐘,如果機器由於另一個進程佔用處理器時間而運行非常緩慢,則可能會錯過。 如果輪到更大的時間間隔(甚至數小時或數天),則當機器當時處於睡眠/休眠模式時仍可能會錯過,或者由於夏令時調整,實際上可能會跳過該時間。

測試事件的時間是否已達到的正確方法是檢查當前時間是否大於或等於目標時間。 您必須禁用定時器或標記該事件已被觸發,以便它不會再次觸發它。

您可能不想觸發錯過的事件(例如,如果機器在目標時間處於關閉狀態,下次打開時該動作可能會或可能不需要)。在這種情況下,您必須測試目標時間(包含)與目標時間之間的當前時間加上一定的時間間隔(目標時間之後您仍然想要觸發事件的最大時間間隔)。

相關問題