【问题标题】:Unit of stopwatch.Elapsed property秒表单位。Elapsed 属性
【发布时间】:2014-07-08 22:23:04
【问题描述】:

我对这个stopWatch.Elapsed 属性感到非常困惑。它以这种格式显示时间值

我想知道我应该在这个输出的末尾添加什么。是ms (01:20:17.0550410ms) 还是只是s (01:20:17.0550410s)? 更进一步,如果我只想取这个输出的ms部分并用它做一些计算我应该取哪个值,是.0550410还是55.041?我的问题可能听起来很傻,但我真的很困惑! 请帮忙。

【问题讨论】:

  • 我建议不要问一个有据可查的基本问题(StopWatch.Elapsed 显然是一个TimeSpan Structure),先看看文档,如果你无法将其转换为你想要,然后问这个问题,因为这个问题是一个更好的问题。
  • 没有。你不明白我的问题。我知道我可以使用 TimeSpan。但它不是关于使用它。它只是类似于 TimeSpan 但不是 TimeSpan!
  • 那你有一个严重的误解。正如我在之前的评论中所链接的,秒表上的属性.Elapsed 毫无疑问是Timespan 结构。要么你很困惑,要么你没有使用 .Net。
  • 您在原始问题中声明stopWatch.Elapsed。如果秒表是System.Diagnostics.Stopwatch 类型的对象,那么您所询问的内容将为您提供TimeSpan。也许你应该澄清它不是TimeSpan
  • 如果我删除这个问题会增加我的声誉吗? 5 反对票真的很伤心。

标签: c# stopwatch elapsedtime


【解决方案1】:

显示的单位是“秒的小数部分”,精确到小数点后第 7 位 - 即百万分之一秒。

因为一毫秒是 0.001 秒,所以你的毫秒数是 55.041。

现在,正如其他人所说,使用 stopWatch.Elapsed.TotalMilliseconds(获取所有毫秒数)或 stopWatch.Elapsed.Milliseconds(获取所有毫秒数少于 1 秒)。

【讨论】:

  • 我不想得到所有的毫秒。我只想从这里——简单。只需知识,无需编码。是的,我在问一个简单的基本问题。有时基本知识会搞砸!
【解决方案2】:

我对这个 stopWatch.Elapsed 属性感到非常困惑。它以这种格式显示时间值

我将从头开始,只是为了确保一切都被理解。

Microsoft .Net 框架设计者已决定所有存储信息的变量都来自Class or a Struct(ture)。这两种基本类型都有一些默认方法。 ValueType 的这些方法之一(我将在下面讨论)是.ToString()。当您在 Windows 运行时结构上调用 ToString() 方法时,它会为不覆盖 ToString() 的值类型提供默认行为。

我假设你在谈论System.Diagnostics.Stopwatch 类。文档指出:

Stopwatch 实例可以测量一个时间间隔的经过时间,或跨多个时间间隔的总经过时间。在典型的秒表场景中,您调用 Start 方法,然后最终调用 Stop 方法,然后使用 Elapsed 属性检查经过的时间。

在我们开始查看秒表的属性之前,我们需要了解,为了让秒表工作,需要有一种方法来存储Magnitude of Time(信息)。 时间幅度在这种情况下是两个时间点之间差异的数字表示;在这种情况下,秒表何时开始和秒表何时结束。 Microsoft .Net 创建了一个名为 TimeSpan 的结构来存储此值。

查看属性Stopwatch.Elapsed 的文档,它的类型为TimeSpan

由于您的屏幕截图似乎在控制台应用程序中,我假设代码(应该始终提供但不是)如下:

Console.Writeline("Took Time: " + stopWatch.Elapsed.ToString());

此代码使用TimeSpan's .ToString() overrideTimeSpan 转换为string

所以不将值传递给.ToString() 是一个空值,默认为("c") 它在TimeSpan 格式字符串中:

所以用你的例子:

01:20:17.0550410s

很明显01 是小时,20 是分钟,17 是秒,.0550410 是十分之一秒(十秒)。在末尾添加任何字符串值很可能没有意义,因为所有数字都具有不同的持续时间。如果您想要更具体,我认为唯一有意义的方法是将其更改为:

01h 20m 17.0550410s

01h 20m 17s 055.0410ms

【讨论】:

    【解决方案3】:

    根据documentation for TimeSpan

    TimeSpan 值可以表示为 [-]d.hh:mm:ss.ff,其中 [...] ss 是秒,ff 是秒的分数

    所以在你的情况下,它是 17.0550410 秒。

    【讨论】:

      【解决方案4】:

      Elasped 是一个 TimeSpan,您显示的是从将其写入控制台的表示(与在任何非字符串对象上调用 .ToString() 相同),该表示以小时:分钟:秒的分数为单位.如果您想以特定数量显示此内容,则 TimeSpan 上有此属性,因此不要这样做

      Console.WriteLine(stopWatch.Elapsed);
      

      你可以的

      Console.WriteLine(stopWatch.Elapsed.TotalMilliseconds);
      

      一个完整的例子来说明

      Console.WriteLine(
      "The timer ran for " + stopWatch.Elapsed.Hours + " Hours, " 
      + stopWatch.Elapsed.Minutes + " Minutes and " 
      + stopWatch.Elapsed.Seconds + ". this amounts to a total of "
      + stopWatch.Elapsed.TotalMilliseconds + " ms" );
      

      【讨论】:

      • 天哪!我没有要求代码!我问了一个简单的问题,但每个人都说得太远了。叹息!
      • 在解释时包含示例代码很常见,我很困惑,您是否在抱怨人们在服务网站上免费回答您的问题并给出示例?
      • 不......这根本不是抱怨!实际上只有两个人理解我的问题(如果我没记错的话)。大多数人甚至不理解我的要求,而您只是给出了代码示例。它很好,但不是我的问题。请不要介意。
      • @Giliweed 如果您认为只有两个人能理解您的问题,那么这可能表明您的问题表达得不好,因此应该受到任何反对?
      • @MattCoubrough,可能是您的权利。下次我会更加注意我的问题模式,以便大家理解。顺便说一句,是的,我失去了一些声誉,这很可悲,但有人确实消除了我所有的怀疑和困惑。所以它毕竟不是那么糟糕。 :)
      【解决方案5】:

      看起来您只是在使用Stopwatch.Elapsed 属性的默认.ToString() 方法,它实际上是一个TimeSpan 对象。您可以完全控制此 TimeSpan 的字符串格式,以及使用它的数字组件进行数学运算(舍入、加法等)。请阅读:Stopwatch.Elapsed Property

      【讨论】:

        【解决方案6】:

        快速搜索“c# stopwatch”会返回MSDN documentation,表明Stopwatch.Elapsed 是一个TimeSpan。然后在“c# TimeSpan”上搜索返回 MSDN documentation,表明 TimeSpan.ToString() 返回具有以下格式的字符串:[-][d.]hh:mm:ss[.fffffff]。那只是使用谷歌。下次在提问之前尝试做一些研究。

        【讨论】:

        • 我在 Google 中进行了搜索,但没有找到可能是什么单位!到处都是 hh:mm:ss 。但这不是我想要的。
        【解决方案7】:

        假设你对StopWatch.Elapsed感兴趣,那么……

        在这种情况下,我发现documentation 通常很有帮助。

        它声明StopWatch.Elapsed 返回

        一个只读的TimeSpan,表示当前实例测量的总经过时间。

        documentation for TimeSpan 声明了它的许多可用属性,其中一个是 Milliseconds,另一个是 TotalMilliseconds。根据文档:

        Milliseconds - 获取当前 TimeSpan 结构所表示的时间间隔的毫秒分量。

        TotalMilliseconds - 获取当前 TimeSpan 结构的值,以整数毫秒和小数毫秒表示。

        其他属性允许您检查天、小时、分钟、秒等。请使用文档,因为它可以为每个人节省大量时间和精力。

        【讨论】:

        • 没有必要假设,OP在他的问题中说得对。
        • OP 并没有说清楚 - 特别是考虑到随后的 cmets...我很谨慎,因此我的答案是合格的。
        猜你喜欢
        • 2023-03-17
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 2015-07-24
        • 2012-06-21
        • 1970-01-01
        相关资源
        最近更新 更多