在C#中设置秒表程序的开始时间

时间:2012-07-27 04:29:44

标签: c# stopwatch

我想写一个简单的秒表程序,我可以使用以下代码

    public Form1()
    {
        InitializeComponent();
    }
    System.Diagnostics.Stopwatch ss = new System.Diagnostics.Stopwatch { };
    private void button1_Click(object sender, EventArgs e)
    {
        if (button1.Text == "Start")
        {
            button1.Text = "Stop";

            ss.Start();
            timer1.Enabled = true;

        }
        else
        {
            button1.Text = "Start";

            ss.Stop();
            timer1.Enabled = false;

        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {


            int hrs = ss.Elapsed.Hours, mins = ss.Elapsed.Minutes, secs = ss.Elapsed.Seconds;
            label1.Text = hrs + ":";
            if (mins < 10)
                label1.Text += "0" + mins + ":";
            else
                label1.Text += mins + ":";
            if (secs < 10)
                label1.Text += "0" + secs;
            else
                label1.Text += secs;


    }

    private void button2_Click(object sender, EventArgs e)
    {
        ss.Reset();
       button1.Text= "Start";
       timer1.Enabled = true;

    }

现在我想为这个秒表设置一个自定义开始时间,例如我希望它不是从0:00开始计数,而是从0:45:00开始 我怎么能这样做,谢谢。

5 个答案:

答案 0 :(得分:12)

秒表没有任何允许您设置自定义开始时间的方法或属性。

您可以继承秒表并覆盖ElapsedMilliseconds和ElapsedTicks以调整您的开始时间偏移量。

    public class MyStopwatch : Stopwatch
    {
        public TimeSpan StartOffset { get; private set; }

        public MyStopwatch(TimeSpan startOffset)
        {
            StartOffset = startOffset;
        }

        public new long ElapsedMilliseconds
        {
            get
            {
                return base.ElapsedMilliseconds + (long)StartOffset.TotalMilliseconds;
            }
        }

        public new long ElapsedTicks
        {
            get
            {
                return base.ElapsedTicks + StartOffset.Ticks;
            }
        }
    }

答案 1 :(得分:6)

根据您的示例创建一个System.TimeSpan的新实例,初始值为45分钟。然后将秒表的值添加到TimeSpan.Add Method。方便地,Stopwatch.Elapsed已经是System.TimeSpan类型。

使用字符串格式化程序将格式化的时间打印到标签中。我认为其中一个答案已经说明了如何做到这一点。否则,以下是有关如何格式化TimeSpan实例TimeSpan.ToString Method (String)或使用custom formatter的一些很好的参考。

var offsetTimeSpan = new System.TimeSpan(0,45,0).Add(ss.Elapsed)

答案 2 :(得分:2)

你不能改变开始时间,但是你可以在Stop()之后修改它,而且没有人更聪明。

快速Google搜索:http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.start(v=vs.90).aspx

一个小修改:

class Program
{
    static void Main(string[] args)
    {            
        System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();

        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes + 45 , ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

结果:

  

RunTime 00:45:10.00

     

按任意键继续。 。

作为开发人员,您可以进行更多的研究,这将对您无可估量。

答案 3 :(得分:1)

  • 额外的SetOffset()方法
  • 使用offset进行额外初始化;
  • 覆盖所有必需的方法
  • 具有相同的类名,因此无需更改项目代码

using System;

public class Stopwatch : System.Diagnostics.Stopwatch
{
    TimeSpan _offset = new TimeSpan();

    public Stopwatch()
    {
    }

    public Stopwatch(TimeSpan offset)
    {
        _offset = offset;
    }

    public void SetOffset(TimeSpan offsetElapsedTimeSpan)
    {
        _offset = offsetElapsedTimeSpan;
    }

    public TimeSpan Elapsed
    {
        get{ return base.Elapsed + _offset; }
        set{ _offset = value; }
    }

    public long ElapsedMilliseconds
    {
        get { return base.ElapsedMilliseconds + _offset.Milliseconds; }
    }

    public long ElapsedTicks
    {
        get { return base.ElapsedTicks + _offset.Ticks; }
    }
}

答案 4 :(得分:0)

是偏移量固定还是变量?

在任何一种情况下,将它作为类的一些成员变量或const,然后添加它。

private TimeSpan offset = TimeSpan.FromSeconds(45);

然后只需更改您的刻度以包含它:

var combined = ss.Elapsed + offset;
int hrs = combined.Hours, mins = combined.Minutes, secs = combined.Seconds;