C#倒计时计时器跳过时间

时间:2012-05-15 11:14:20

标签: c# string timer countdown countdowntimer

我在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时做某事???

4 个答案:

答案 0 :(得分:10)

好吧,让我们看看时间为10:00:00时会发生什么。

  1. 减去一小时:09:00:00
  2. 将分钟设置为59:09:59:00
  3. 如果您发现时间已经过了一分钟(10:00:00 - 09:59:00 = 00:01:00)。解决方案是将秒数设置为59。所以现在我们的代码是。

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

答案 1 :(得分: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();

答案 2 :(得分:1)

您还需要将Second设置为59。否则,一旦计时器再次打勾,它会立即切换到else if (Minute != 00)并将Minute(已经是59)减1。

答案 3 :(得分: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
    }        
}