【问题标题】:Get time in milliseconds using C#使用 C# 以毫秒为单位获取时间
【发布时间】:2011-04-30 07:27:51
【问题描述】:

我正在编写一个程序,我需要在其中获取以毫秒为单位的时间。时间,我的意思是一个永远不等于自己的数字,并且总是比一秒钟前大 1000 个数字。我尝试将DateTime.Now 转换为TimeSpan 并从中获取TotalMilliseconds...但我听说它并不完全准确。

有更简单的方法吗?

【问题讨论】:

  • 您是否期望任何两个调用总是导致价值增加?通常,比计时器分辨率允许的最小间隔更近的调用将产生相同的值。您需要以假精度序列化程序的形式添加自己的决胜局。
  • “一个永远不等于自身的数字”。听起来……很复杂。 ;)
  • NaN 实际上符合该要求。尽管是“非数字”,但它是数字类型,不等于自身。

标签: c# datetime milliseconds time-precision


【解决方案1】:
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

这其实就是DateTimeOffset类(.NET Framework 4.6+、.NET Standard 1.3+)中各种Unix转换方法的实现方式:

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

【讨论】:

  • 标题是“获取时间,以毫秒为单位”。这个答案很有帮助。
  • 是的,对于我们这些正在寻找所提出问题的答案的人来说,这非常有帮助,谢谢。
  • 如果你想要小数(即使DateTime.Now 不是经常“更新”),当然使用decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;
  • 这比为搜索结果选择的答案有用得多,甚至对于我从原始问题中收集到的答案也是如此。
  • 这个答案救了我的命。有类似的代码,但不起作用。想不通为什么。然后我看到了毫秒前面的long 数据类型。使用int 肯定会溢出。
【解决方案2】:

使用Stopwatch 类。

提供一组方法和 您可以使用的属性 准确测量经过的时间。

这里有一些关于实现它的好信息:

Performance Tests: Precise Run Time Measurements with System.Diagnostics.Stopwatch

【讨论】:

  • 秒表是诊断的一部分。应该在实际代码中使用吗?
  • 这通常只精确到最接近的 15ms 左右。
  • 它到底有多贵?也许我们应该秒表秒表:)
  • @Steven,这取决于操作系统和底层硬件。如果可用,则使用高分辨率计时器,这是我所知道的所有当前基于桌面和服务器的 x86 Windows 版本的情况。检查 Frequency 和 IsHighResolution 属性以获取更多详细信息。在操作系统级别,QueryPerformanceCounter 和 QueryPerformanceFrequency 是支持此功能的低级 API。
【解决方案3】:

DateTime.Ticks 属性获取表示日期和时间的刻度数。

10,000 Ticks 是一毫秒(每秒 10,000,000 个滴答声)。

【讨论】:

  • 但是Ticks的分辨率是非常小于1/10000s,可能是1/62s
  • @codymanix - 来自 MSDN:A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.
  • 当然可以,但是操作系统没有这么精确的分辨率。
  • @codymanix 是正确的。以此类推,埃是长度单位;一百亿埃等于一米。您可以编写一个函数,将您的身高报告为以埃为单位的 64 位整数,但如果您只有一个精确到厘米的米尺,那么该函数表示亚纳米精度的事实完全无关紧要。不太重要的数字将是垃圾。
  • @RedFilter:如果你真的知道自己的年龄精确到毫秒,你可以想象这样的话,“当我再次眨眼时,我的年龄将是 x 毫秒。”更深层次的问题不是沟通,而是测量:即使是最近的一秒也不可能知道你的出生。
【解决方案4】:

我使用以下课程。曾经在网上找到过,估计是最好的NOW()

/// <summary>Class to get current timestamp with enough precision</summary>
static class CurrentMillis
{
    private static readonly DateTime Jan1St1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    /// <summary>Get extra long current timestamp</summary>
    public static long Millis { get { return (long)((DateTime.UtcNow - Jan1St1970).TotalMilliseconds); } }
}

来源不明。

【讨论】:

  • FWIW,这个常用的sn-p的全部意义在于制作一个与Unix时间戳标准兼容的时间戳。为此,它至关重要。如果只想做计时,那是不必要的昂贵。
  • 这在需要将毫秒从 C# 传递给 java 时很有用
【解决方案5】:

你可以试试QueryPerformanceCounter原生方法。请参阅http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html 了解更多信息。这就是 Stopwatch 类使用的内容。

更多信息请参见How to get timestamp of tick precision in .NET / C#?

Stopwatch.GetTimestamp() 允许访问此方法:

public static long GetTimestamp() {
     if(IsHighResolution) {
         long timestamp = 0;
         SafeNativeMethods.QueryPerformanceCounter(out timestamp);
         return timestamp;
     }
     else {
         return DateTime.UtcNow.Ticks;
     }
 }

【讨论】:

  • AFAIK 秒表在内部使用 QueryPerformanceCounter(如果可用)
  • 是的,Stopwatch.GetTimestamp() 的内部实现实际上提供了对该方法的访问。
【解决方案6】:

我使用了 DateTime.Now.TimeOfDay.TotalMilliseconds(当前日期),希望它也对您有所帮助。

【讨论】:

  • 由于 TimeOfDay 每天午夜重置为零,因此不会返回递增值(如原始海报所要求的那样)。此外,它会与海报提到的仅使用 DateTime 时相同的潜在问题。现在从中获取总毫秒数。
  • Jim O'Neil 我同意你的观点,这就是为什么我在帖子中提到“(当天)”...顺便说一句,我的解决方案适用于我的问题,因为我的问题不是日期- 具体来说,我只需要将毫秒部分用作计数器,所以我把它贴在这里。我是新来的,所以如果我把它发布在错误的地方很抱歉:)
【解决方案7】:

使用System.DateTime.Now.ToUniversalTime()。这会使您的读数采用已知的基于参考的毫秒格式,完全消除了日期变化等。

【讨论】:

  • 很高兴知道,但与所提出的问题无关,这是关于时间(时间流逝的测量),而不是关于准确传达时间的问题。
【解决方案8】:

使用 Stopwatch 类我们可以从System.Diagnostics 实现它。

Stopwatch stopwatch  = new Stopwatch();
stopwatch.Start();
stopwatch.Stop();
Debug.WriteLine(stopwatch.ElapsedMilliseconds);

【讨论】:

    【解决方案9】:

    System.DateTimeOffset.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt") 获取毫秒,格式为 '04/01/2021 04:32:14.788 PM'

    https://docs.microsoft.com/en-us/dotnet/standard/base-types/how-to-display-milliseconds-in-date-and-time-values

    【讨论】:

      【解决方案10】:

      据我了解,Environment.TickCount 符合您的要求。它返回自启动以来的毫秒数,因此它总是增加并可用于计算以毫秒为单位的经过时间。如果您还想要绝对时间,您可以获取当前时间和当前 Environment.TickCount,并根据该时间和新 Environment.TickCount 计算新的绝对时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2013-05-26
        • 2017-08-05
        • 2013-05-09
        相关资源
        最近更新 更多