【问题标题】:Set start time for Stopwatch program in C#在 C# 中设置秒表程序的开始时间
【发布时间】:2020-11-18 00:24:08
【问题描述】:

我想写一个简单的秒表程序,我可以用下面的代码让它工作

    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:00 开始计数,而是从 0:45:00 开始 怎么办,谢谢。

【问题讨论】:

    标签: c# stopwatch


    【解决方案1】:

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

    您可以继承 Stopwatch 并覆盖 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;
                }
            }
        }
    

    【讨论】:

    • 听起来很多代码只是为了能够抵消计时器。我认为在需要显示秒表值时添加偏移量是一种更好的方法。如果重用很重要,请添加代码作为扩展方法 (msdn.microsoft.com/en-us/library/bb383977.aspx)。
    • @BigT:真的吗?很多代码?我发布了一个实现。它可能比您的扩展方法稍长,但它封装了所需的行为。而且它真的不是很多代码。它解决了最初的问题。
    • 请注意,属性不会被覆盖,而是使用 new 关键字隐藏。这意味着只有当您的变量类型恰好是 MyStopwatch 时才会使用它们。例如。如果您决定将其存储在 List 中,那么您最终将访问原始 Stopwatch 类型属性并获得没有偏移量的值。
    【解决方案2】:

    根据您的示例创建一个初始值为 45 分钟的 System.TimeSpan 的新实例。然后将秒表的值添加到它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)
    

    【讨论】:

      【解决方案3】:
      • 额外的 SetOffset() 方法
      • 额外的偏移初始化;
      • 覆盖所有需要的方法
      • 具有相同的类名,因此无需更改项目代码

      .

      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】:

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

        快速谷歌搜索: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);
            }
        }
        

        结果:

        运行时间 00:45:10.00

        按任意键继续。 . .

        作为开发人员,您需要进行更多研究。

        【讨论】:

        • 应该使用 TimeSpan 中内置的 Add 函数来完成数学运算。这段代码经常会失败。只要秒表的分钟数 >= 15,那么时间格式就无效。
        【解决方案5】:

        偏移量是固定的还是可变的?

        在任何一种情况下,将其作为类的某个成员变量或 const 并添加即可。

        private TimeSpan offset = TimeSpan.FromSeconds(45);
        

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多