使用C#获取时间(以毫秒为单位)


131

我正在编写一个程序,其中需要以毫秒为单位。到时间,我的意思是一个永远不会等于自己的数字,并且总是比第二秒大1000个数字。我试过转换DateTime.Now为a TimeSpanTotalMilliseconds从中获取...,但我听说它并不十分准确。

有没有更简单的方法可以做到这一点?


您是否期望任何两个电话始终引领价值增长?通常,比计时器分辨率允许的最小间隔更近的调用将产生相同的值。您将需要以假精度序列化器的形式添加自己的决胜局。
史蒂文·苏迪特

16
“一个永远不等于自己的数字”。听起来很复杂。;)
Mizipzor 2012年

1
NaN实际上会满足该要求。尽管不是数字,但它是数字类型,并不等于其自身。
Yay295

Answers:


78

使用Stopwatch该类。

提供了一组方法和属性,可用于准确测量经过的时间。

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

性能测试:使用System.Diagnostics.Stopwatch进行精确的运行时测量


8
秒表是“诊断”的一部分。应该在真实代码中使用它吗?
Andrey 2010年


通常这仅精确到最接近的15ms左右。
史蒂文·苏迪特

11
到底有多贵?也许我们应该秒表秒表:)
jb。

3
@Steven,这取决于操作系统和底层硬件。如果有的话,将使用高分辨率计时器,我所知道的所有当前基于台式机和服务器的x86 Windows版本都是如此。检查Frequency和IsHighResolution属性以获取更多详细信息。在操作系统级别,QueryPerformanceCounter和QueryPerformanceFrequency是支持此功能的低级API。
克里斯·泰勒

320
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

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

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

65
标题是“获取时间(以毫秒为单位)”。这个答案很有帮助。
航空航天

33
是的,对于我们中那些正在寻找所提出问题的答案的人,这非常有帮助,谢谢。
430788

1
如果您想要小数点(即使DateTime.Now不是很经常“更新”),也可以使用小数点decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;
杰普·斯蒂格·尼尔森

1
这比为搜索结果甚至我从原始问题中收集的答案所选择的答案要有用得多。
bwoogie '16

1
这个答案救了我一命。得到了类似的代码,但是不起作用。不知道为什么。然后我看到了long毫秒前的数据类型。使用int肯定会溢出。
FisNaN

13

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

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


4
但是Ticks的分辨率非常不到1 / 10000s,也许是1 / 62s
codymanix

2
@codymanix-来自MSDN:A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.
Itay Karo 2010年

5
可以,但是操作系统没有这样精确的分辨率。
codymanix

6
@codymanix是正确的。以此类推,埃是长度的单位;100亿埃达到一米。您可以编写一个函数来报告您的身高,以Angstroms为单位的64位整数,但是如果您所拥有的只是一个精确到厘米的米尺,那么该函数代表亚纳米精度的事实就完全无关紧要了。不太重要的数字将成为垃圾。
埃里克·利珀特

4
@RedFilter:如果您实际上知道自己的年龄最接近的毫秒数,则可以想象这样说:“当我再次眨眼时,我的年龄将是x毫秒。” 更深层的问题不是沟通,而是测量:即使是最近的一秒钟,您的出生也不大可能知道。
史蒂文·苏迪特

11

我使用以下课程。我曾经在互联网上找到它,它被认为是最好的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); } }
}

来源不明。


5
FWIW,这个常用代码段的全部要点,是制作与Unix时间戳标准兼容的时间戳。为此,这至关重要。如果只是想安排时间,那将是不必要的昂贵。
ToolmakerSteve

8

您可以尝试使用QueryPerformanceCounter本机方法。有关更多信息,请参见http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html。这就是Stopwatch该类使用的。

请参阅如何在.NET / C#中获取刻度精度的时间戳?想要查询更多的信息。

Stopwatch.GetTimestamp() 可以访问此方法:

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

1
AFAIK
秒表

是的,的内部实现Stopwatch.GetTimestamp()实际上提供了对该方法的访问。
Pieter van Ginkel

5

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


1
由于TimeOfDay每天都会在午夜重置为零,因此不会返回增加的值(如原始海报所要求的)。加上使用DateTime时发布者提到的潜在问题,现在可以从中获取总毫秒数。
Jim O'Neil 2012年

3
吉姆·奥尼尔(Jim O'Neil)我同意你的意见,这就是为什么我在帖子中提到“(当天)”…顺便说一句,我的解决方案可以解决我的问题,因为我的问题不是特定于日期的,我只需要获取毫秒部分用作计数器,所以我在这里发布了它。我是新来的,因此,如果我在错误的位置张贴它,很抱歉:)
Sarvan

2

使用System.DateTime.Now.ToUniversalTime()。这样一来,您的阅读就可以采用已知的基于参考的毫秒格式,从而完全消除了日期变更等问题。


很高兴知道,但与所问的问题无关,该问题与时间(时间流逝的度量)有关,而不与准确传达时间有关。
ToolmakerSteve
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.