2012-05-15 59 views
0

我有這個在C#倒計時跳轉時間在C#

private void counter_Tick(object sender, EventArgs e) 
    { 
     Time.Text = String.Format("{0:000}", Hour) + ":" + String.Format("{0:00}", Minute) + ":" + String.Format("{0:00}", Second); 
     if (Second != 00) 
     { 
      Second = Second - 1; 
     } 
     else if (Minute != 00) 
     { 
      Minute = Minute - 1; 
      Second = 59; 
     } 
     else if (Hour != 00) 
     { 
      Hour = Hour - 1; 
      Minute = 59; 
     } 
     else 
     { 
      counter.Stop(); 
      Time.ForeColor = Color.Red; 
     } 
    } 

哪個不工作,但是當它到達減去一小時,以增加分鐘,就從00分鐘變爲58分鐘,而不是59

EG。

From: 001:00:00 
To: 000:58:59 

是否有更好的方法來製作倒數計時器,當它遇到000:00:00時做些什麼?

+0

我會不使用計時器,或不這樣。我會爲此使用DateTime。 –

回答

9

那麼讓我們來看看時間爲10:00:00會發生什麼。

  1. 扣除一小時:09:00:00
  2. 設置分鐘爲59:09:59:00

如果您發現時間過去了一分鐘(10:00:00 - 09:59:00 = 00:01:00)。解決方法是將秒數也設置爲59。所以現在我們的代碼是。

// ... 
else if (Hour != 00) 
{ 
    Hour = Hour - 1; 
    Minute = 59; 
    Second = 59; 
} 
// ... 
+0

是的,愚蠢的錯誤,但那是什麼發生,謝謝 –

+0

不客氣。我們有時會犯一些愚蠢的錯誤。 – 2012-05-15 11:23:53

1

您還需要將Second設置爲59。否則,一旦計時器再次滴答,它立即切換到else if (Minute != 00)並將Minute(已經是59)減1。

0
DateTime start; 
DateTime final; 

private void start() 
{ 
    start = DateTime.Now; 
    final = start + TimeSpan.FromHours(1); 
} 

private void counter_Tick(object sender, EventArgs e) 
{ 
    start = DateTime.Now; 
    Time.Text = (final-start).Hours.ToString() + ":" + (final-start).Minutes.ToString() + ":" + (final-start).Seconds.ToString();  
    if (final == start) 
    { 
     //final code 
    }   
} 
+1

Timespans會是一個更好的選擇,因爲您對日期部分不感興趣。 final.addSeconds(-1).ToString()會比(最終開始)好3次,因爲這可能意味着隨着時間的推移,你跳過了間隔。 –

+0

是的,這是真的,但仍然更好,因爲我認爲 –

+0

原來的解決方案其實不是。只需再次查看,每個計數器刻度都會輸出1:00:00,因爲每個計數器刻度都不會減少。永遠不會達到你的最終代碼,因爲最終的代碼永遠無法平等開始 –

2

您可以使用標準的.NET類減去時間:

private TimeSpan timeSpan; 
private TimeSpan oneSecond = new TimeSpan(0, 0, 1); 

private void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Time.Text = timeSpan.ToString(); 

    if (timeSpan == TimeSpan.Zero) 
    { 
     Time.ForeColor = Color.Red; 
     timer.Stop(); 
     return; 
    } 

    timeSpan -= oneSecond; 
} 

初始化的時間跨度,當你開始你的計時器(我使用System.Timers.Timer):

timeSpan = new TimeSpan(1, 0, 0); 
Timer timer = new Timer(1000); 
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
timer.Start();