时间跨度减去秒表倒计时

时间:2016-11-07 20:08:54

标签: c# .net winforms timer subtraction

我使用WinForm' s。我的表格中有一个标签应该从0:20倒数。到0:00秒。我在这里尝试这样做,但编译器给了我一个错误。

  

错误:无法转换为' int'到' System.TimeSpan'

为什么我不能使用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);
    }

4 个答案:

答案 0 :(得分:3)

对于简单的第二个计数器,更好的方法是使用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();
    }
}

答案 1 :(得分:2)

stopwatch.Elapsed.Seconds返回int,具体来说就是秒数。 timespan.Subtract(TimeSpan)接受TimeSpan对象。

您可以尝试:

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

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

请注意您的逻辑存在缺陷。每次发射嘀嗒事件时都会重新启动一个新的秒表,因此每次发射时你都会有一个新的0点秒表,你将在文本框中得到19或20。 在其他地方实例化你的秒表,以便它们在刻度线之间相同。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

TimeSpan.Subtract期望你从中减去另一个TimeSpan实例(TimeSpan本身并没有绑定到特定的时间单位,所以通过减去say" 15"它不会'#34 ;知道"你有什么单位)。

你想要的是

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

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

00:00:20

或(利用秒表的经历是TimeSpan本身的事实)

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

但这会产生

00:00:19.9999765

这可能太精确而无法显示给最终用户(由秒表精确地记录下来)。