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

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

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开始计数我怎么能这样做,谢谢。

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

比使用字符串格式化程序将格式化的时间打印到标签中。 我认为其中一个答案已经说明了如何做到这一点。 否则,这里有一些关于如何格式化TimeSpan实例TimeSpan.ToString方法(字符串)或使用自定义格式化程序的一些很好的参考。

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

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

您可以inheritance秒表并覆盖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; } } } 

你不能改变开始时间,但是你可以在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); } } 

结果:

RunTime 00:45:10.00

按任意键继续 。 。 。

对您的一点研究将帮助您作为开发人员无法估量。

  • 额外的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; } } } 

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

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

 private TimeSpan offset = TimeSpan.FromSeconds(45); 

然后只需更改您的勾选以包含它:

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