如何编写从0:0:0:0启动的Timer?修改现有Timer计时起始值求助
解决方案:让Timer输出累计计时而非当前系统时间
这个问题很容易搞定,核心思路是记录Timer的启动初始时刻,每次Elapsed事件触发时,计算当前时间与初始时刻的时间差,再将这个时间差格式成你想要的00:00:00.000累计计时格式。
具体修改步骤如下:
- 添加私有字段存储启动时间:在你的类中新增一个
DateTime类型字段,用来保存Timer开始运行的时刻。 - 初始化启动时间:在启动Timer之前,把这个字段赋值为当前系统时间(也就是Timer计时的起点)。
- 修改Elapsed事件逻辑:不再直接输出当前系统时间,而是计算时间差并格式化输出。
修改后的完整代码示例
using System; using System.Timers; public class TimerExample { // 新增字段:存储Timer启动的初始时刻 private DateTime _startTime; private Timer _timer; public TimerExample() { _timer = new Timer(1000); // 这里间隔设为1秒,可根据你的需求调整 _timer.Elapsed += OnTimerElapsed; } public void StartTimer() { // 记录启动时刻 _startTime = DateTime.Now; _timer.Start(); Console.WriteLine("Timer started, counting from 00:00:00.000"); } private void OnTimerElapsed(object sender, ElapsedEventArgs e) { // 计算从启动到当前的累计时间差 TimeSpan elapsedTime = DateTime.Now - _startTime; // 格式化时间差为"hh:mm:ss.fff"格式 string formattedTime = elapsedTime.ToString(@"hh\:mm\:ss\.fff"); Console.WriteLine($"The Elapsed event was raised at {formattedTime}"); } // 可选:停止Timer的方法 public void StopTimer() { _timer.Stop(); Console.WriteLine("Timer stopped"); } public static void Main() { TimerExample example = new TimerExample(); example.StartTimer(); Console.WriteLine("Press any key to stop..."); Console.ReadKey(); example.StopTimer(); } }
关键说明
- 时间差计算:
TimeSpan类型专门用来表示时间间隔,通过DateTime.Now - _startTime可以精准得到从Timer启动到当前事件触发的累计时长。 - 格式化字符串:
@"hh\:mm\:ss\.fff"是自定义时间格式,其中:hh:两位小时数(如果累计时间超过24小时,会自动循环;若需要显示超过24的小时数,可改用HH或者d\.hh来显示天数+小时)mm:两位分钟数ss:两位秒数fff:三位毫秒数- 反斜杠
\用来转义冒号和点号,确保它们作为普通字符输出。
这样修改后,你的Timer就会输出从00:00:00.xxx开始的累计计时,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者user9630194
相关产品推荐
相关产品推荐

