【问题标题】:How to calculate Elapsed Duration with DateTime如何使用 DateTime 计算经过的持续时间
【发布时间】:2021-04-19 16:05:14
【问题描述】:

我有一个问题。在此代码中,一步时间和循环时间计算为 0。它不计算一分钟前的秒数。但是,当它是 1 分钟时,它会计算分钟。但我们希望它单独计算。我们在哪里犯错了?

30秒完成一分钟,60秒完成1分钟。

StepPerMinute 仅在完成一分钟后才应响应,否则它应落入 cath 块,但我遇到了问题。

AStepDuration 必须每秒计算一次,但 1 分钟后开始计算,然后返回零。

循环时间总是为零。

if (stepCount == 1)
{
    firstStepTime = DateTime.Now;
}
else if (stepCount > 1)
{
    DateTime stepTime = DateTime.Now;
    var result = stepTime.Subtract(firstStepTime);
    var totalMinutes = Convert.ToInt16(result.TotalMinutes);
    totalSeconds = Convert.ToInt16(result.TotalSeconds);

    try
    {
        stepsPerMinute = Convert.ToInt16(stepCount / totalMinutes);
        AStepDuration = (Convert.ToDouble( totalSeconds ) / stepCount);
        CycleTime = totalSeconds * (2 / stepCount); 
    }
    catch (DivideByZeroException)
    {
      stepsPerMinute = stepCount;
    }

    Console.WriteLine("Total time: {0}", totalMinutes+"dk");
    Console.WriteLine("Total second : {0}", totalSeconds+"sn");
    Console.WriteLine("Steps Per Minute(Cadence): {0}", stepsPerMinute +"step/min");
    Console.WriteLine("A Step Duration: {0}", AStepDuration);
    Console.WriteLine("Cycle Time: {0}", CycleTime + "sn");
}

【问题讨论】:

  • 我非常不清楚“它不计算一分钟前的第二秒”是什么意思。如果您可以提供minimal reproducible example,帮助您会容易得多。 (顺便说一句,我还强烈建议您检查零作为除数,而不是捕获 DivideByZeroException。)
  • 另外,请检查您的类型以确保您没有进行不必要的转换/转换。例如,result.TotalSeconds 是双精度型,但您要转换为 Short,只是为了立即转换回双精度型。
  • 所有不必要的转换的副作用是您可能以整数除法结束。
  • @JonSkeet 它仅在经过一分钟后才开始计算步长持续时间(BirAdİmSüresi)。它需要以秒为单位计算,但它总是在 1 分钟结束之前给我结果 0。我不完全理解你的建议。我应该如何编写 Dividedbyzero 异常。可以在示例代码中展示一下吗?
  • 不,因为恐怕代码的整个目的目前还不清楚。同样,我强烈建议您创建一个 minimal reproducible example 并阅读 codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question 以获取有关编写好问题的建议。 (我还建议确保所有变量名称都是英文,以解决您的 Stack Overflow 问题 - 但您可能会发现您并不需要当前拥有的所有变量。)

标签: c# time kinect


【解决方案1】:

我不确定 Kinect 是否有 StopWatch,但是,如果它可用,那么您可以像这样使用它,而不是使用 DateTime

    Stopwatch stopWatch = new Stopwatch();

    // you may stop like this stopWatch.Stop()
    // or reset like this stopWatch.Reset()
    if (stepCount == 1)
    {
        stopWatch.Start();
    }
    else if (stepCount > 1)
    {
        try
        {
            stepsPerMinute = Convert.ToInt16(stepCount / stopWatch.Elapsed.Minutes);
            BirAdimSüresi = (Convert.ToDouble(stopWatch.Elapsed.Seconds) / stepCount);
            CycleTime = stopWatch.Elapsed.Seconds * (2 / stepCount); // saniye or CycleTime =120/ cadence

        }
        catch (DivideByZeroException)
        {
            stepsPerMinute = stepCount;
        }

        Console.WriteLine("Total time: {0}", stopWatch.Elapsed.Minutes + "dk");
        Console.WriteLine("Total seconds : {0}", stopWatch.Elapsed.Seconds + "sn");
        Console.WriteLine("Steps Per Minute(Cadence): {0}", stepsPerMinute + "step/min");
        Console.WriteLine("Bir Adim Süresi: {0}", BirAdimSüresi);
        Console.WriteLine("Cycle Time: {0}", CycleTime + "sn");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2013-03-07
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多