使用DateTime和TimeSpan在C#中使用秒表

时间:2017-06-18 16:42:27

标签: c#

我在其中编写了一个名为秒表的类及其两个方法(Start()和Stop())。每次我开始和停止时,我都应该获得TimeSpan的间隔时间。但每次我运行它,我总是得到TimeSpan 00:00:00。哪里错了? 这是我的代码:

class Stopwatch
    {
        private DateTime _start;
        private DateTime _stop;
        private bool _running;

        public void Start()
        {
            if (!_running)
            {
                _running = true;
                _start = DateTime.Now;
            }
        }
        public TimeSpan Stop()
        {
            if (_running)
            {
                _stop = DateTime.Now;
                _running = false;
            }
            return (_stop - _start);
        }

在main方法中运行:

static void Main(string[] args)
{
    Console.WriteLine("Stopwatch application");
    Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit.");
    while (true)
    {
        Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit.");
        var input = Console.ReadLine();
        var stopWatch = new Stopwatch();
        if (input == "y")
        {
            Console.WriteLine("start");
            stopWatch.Start();
        }
        if (input == "n")
        {
            Console.WriteLine("stop");
            Console.WriteLine(stopWatch.Stop().ToString("G"));
        }
        if (input == "q") break;
    }
}

我尝试过的一个解决方案是,用Cosole.ReadLine()替换所有输入,效果很好。但我的原始代码出了什么问题?

2 个答案:

答案 0 :(得分:10)

您在每次迭代时都会创建model.predict()的新实例 - 这意味着当您致电{Stopwatch时,_running 总是false 1}}。

另外:

  • 您应该使用Stop代替DateTime.UtcNow,否则您将看到"更改"如果DST开始或结束,则为-1小时或1小时
  • 您根本不需要DateTime.Now课程 - 您应该使用System.Diagnostics.Stopwatch代替。这通常具有更高的精度,并且不会受到改变系统时钟的因素的影响。它专为此类事物而设计。

所以像(在几个地方调整风格):

Stopwatch

答案 1 :(得分:-1)

static void Main(string[] args)
{
    Console.WriteLine("Stopwatch application");
    Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit.");
    var stopWatch = new Stopwatch();
    while (true)
    {
        Console.WriteLine("tap 'y' to start,'n' to stop,'q' to quit.");
        var input = Console.ReadLine();

        if (input == "y")
        {
            Console.WriteLine("start");
            stopWatch.Start();
        }
        if (input == "n")
        {
            Console.WriteLine("stop");
            TimeSpan temp = stopWatch.Stop();
            Console.WriteLine("{0:D2}:{1:D2}:{2:D2}", temp.Hours, temp.Minutes, temp.Seconds);
        }
        if (input == "q") break;
    }
}

我希望它对你有用。