使计时器减少实际秒数

Make timer decrement actual seconds

我有这个代码:

public void startSpinTimer()
{
  spinTimer = new DispatcherTimer();
  spinTimer.Tick += spinTimer_Tick;
  spinTimer.Interval = new TimeSpan(0, 0, 0, 1);
  spinTimer.Start();
}

void spinTimer_Tick(object sender, object e)
{
  spinTime--;
  spinnerTimer_txtBlock.Text = spinTime.ToString();
}

在此实例中,spinTime 变量为 6。我试图让 6 代表小时,所以它会显示为 06:00:00 然后每次计时器滴答时它都会花一秒钟的时间使 06:00:00 更改为 05:59:59然后 05:59:58 依此类推..

我已经尝试将 spinTime 转换为 DateTime 变量,但是它不起作用,看起来我没有沿着正确的路径来实现我想要做的事情。

有谁知道我做错了什么吗?

谢谢

我假设spinTime 是TimeSpan 类型。 你可以用它来减少一秒。

            spinTime = spinTime.Subtract(TimeSpan.FromSeconds(1));

我不会使用整数,而是使用存储当前时间 + 6 小时的 DateTime,并计算当前时间与 "end" 时间之间的差异:

// right before starting timer
DateTime endTime = DateTime.Now.AddHours(6);

// in the `Tick` event:
spinnerTimer_txtBlock.Text = (endTime - DateTime.Now).ToString("hh\:mm\:ss");

使用计时器 "tick off seconds" 是不可靠的。您不能保证滴答声会恰好每 1 秒发生一次。相反,我建议如下:

DateTime start = DateTime.Now; //On the start of the timer store the current time
TimeSpan spinTime = new TimeSpan (6,0,0); //Time to spin

在每个报价单上计算当前时间和开始时间之间的差异:

TimeSpan delta = DateTime.Now-start; //Time elapsed since start
TimeSpan timeRemaining = spinTime - delta; //Time remaining

这样您就可以确保您不会依赖计时器来记录准确的时间。此外,您可以缩短刻度线的长度以提高准确性。