我想写一个简单的秒表程序,我可以使用以下代码
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开始 我怎么能这样做,谢谢。
答案 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)
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;