时间跨度减去秒表倒计时

本文关键字:倒计时 时间跨度 | 更新日期: 2023-09-27 18:16:53

我用的是WinForm的。在我的表单中有一个标签,它应该从0:20秒开始倒数。到0点。我想在这里做这个,但是编译器给了我一个错误。

错误:无法从'int'转换为'System '。时间间隔"

为什么我不能使用timespan.Subtract()?我怎么从0:20倒数到0:00呢?

    private void timer1_Tick(object sender, EventArgs e)
    {
        TimeSpan timespan = TimeSpan.FromSeconds(20);
        Stopwatch stopwatch = new Stopwatch();
        stopwatch.Start();
        Time_label.Text = timespan.Subtract(stopwatch.Elapsed.Seconds);
    }

时间跨度减去秒表倒计时

对于一个简单的第二个计数器,一个更好的方法是利用Timer本身。

private readonly Timer _timer;    
private TimeSpan _timespan;
private readonly TimeSpan _oneSecond;
public Form1()
{
    InitializeComponent();
    _timer = new Timer();
    _timer.Tick += timer1_Tick;
    _timer.Interval = 1000;       
    _timespan = TimeSpan.FromSeconds(20);
    _oneSecond = new TimeSpan(0, 0, 0, 1);
    _timer.Start();
}
private void timer1_Tick(object sender, EventArgs eventArgs)
{
    if (_timespan >= TimeSpan.Zero)
    {
        Time_label.Text = _timespan.ToString(@"m':ss");
        _timespan = _timespan.Subtract(_oneSecond);
    }
    else
    {
        _timer.Stop();
    }
}

stopwatch.Elapsed.Seconds返回和int,具体为秒数。timespan.Subtract(TimeSpan)接受一个TimeSpan对象

你可以试试:

Time_label.Text = 20 - stopwatch.Elapsed.Seconds;

Time_label.Text = timespan.Subtract(stopwatch.Elapsed).Seconds;

请注意你的逻辑有一个缺陷。每次触发tick事件时,你都会重新启动一个新的秒表,所以每次它触发时,你都会有一个新的0:00秒表你会在文本框中得到19或20。在其他地方实例化你的秒表,使它在滴答之间是相同的。

编辑:正如Quantic的评论所建议的那样,如果你计划拥有超过一分钟的时间

Time_label.Text = (int)timespan.Subtract(stopwatch.Elapsed).TotalSeconds;

时间跨度。Subtract需要另一个TimeSpan结构体。Stopwatch.Elapsed.Seconds是一个Int32结构体。没有任何内置的隐式转换将Int32转换为TimeSpan。你可以试试这个

Time_label.Text = timespan.Subtract(TimeSpan.FromSeconds(stopwatch.Elapsed.seconds)).ToString();

时间跨度。Subtract期望你从中减去TimeSpan的另一个实例(TimeSpan本身不绑定到特定的时间单位,所以通过减去"15",它不"知道"你想要的是什么单位)。

你想要的是

Time_label.Text = Timespan.Subtract(TimeSpan.FromSeconds(stopwatch.Elapsed.Seconds)));

生成一个相当漂亮的预格式化

00:00:20

或者(利用Stopwatch的Elapsed本身就是一个TimeSpan这一事实)

Time_label.Text = timespan.Subtract(stopwatch.Elapsed);

但是产生

00:00:19.9999765

可能太精确而无法显示给最终用户(这是由Stopwatch精确到刻度造成的)