我正在制作一个程序,需要获取毫秒级别的时间。所谓的时间是指一个数字,它从未等于自身,并且始终比一秒前大1000个数字。我尝试将DateTime.Now
转换为TimeSpan
,并从中获取TotalMilliseconds
... 但我听说这种方法并不完全准确。
有更简单的方法吗?
我正在制作一个程序,需要获取毫秒级别的时间。所谓的时间是指一个数字,它从未等于自身,并且始终比一秒前大1000个数字。我尝试将DateTime.Now
转换为TimeSpan
,并从中获取TotalMilliseconds
... 但我听说这种方法并不完全准确。
有更简单的方法吗?
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
这实际上是Unix转换方法在 DateTimeOffset
类(.NET Framework 4.6+,.NET Standard 1.3+)中的实现:
long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();
DateTime.Now
并不经常更新),那么可以使用以下代码: decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;
。 - Jeppe Stig Nielsenlong
数据类型。使用 int
肯定会溢出。 - FisNaNStopwatch
类。
在这里有一些关于实现它的好信息:提供了一组方法和属性,用于准确地测量经过的时间。
DateTime.Ticks
属性获取表示日期和时间的滴答数。
10000个Ticks是1毫秒 (每秒钟有10,000,000个ticks)。
一个滴答代表一百纳秒或者说是一千万分之一秒。一毫秒包含 10,000 个滴答。
- Itay Karo我使用以下类。我曾经在互联网上找到它,被认为是最好的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); } }
}
来源不明。
QueryPerformanceCounter
本地方法。有关更多信息,请参见http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html。这是Stopwatch
类使用的方法。
有关更多信息,请参见如何在.NET/C#中以tick精度获取时间戳?。
Stopwatch.GetTimestamp()
提供了访问此方法的途径:
public static long GetTimestamp() {
if(IsHighResolution) {
long timestamp = 0;
SafeNativeMethods.QueryPerformanceCounter(out timestamp);
return timestamp;
}
else {
return DateTime.UtcNow.Ticks;
}
}
Stopwatch.GetTimestamp()
的内部实现确实提供了对该方法的访问。 - Pieter van GinkelSystem.Diagnostics
实现它。Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
stopwatch.Stop();
Debug.WriteLine(stopwatch.ElapsedMilliseconds);
使用System.DateTime.Now.ToUniversalTime()
。这将以已知的基于参考的毫秒格式提供您的日期和时间,完全消除了日期更改等问题。
System.DateTimeOffset.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt")
可以获取毫秒的格式为 '04/01/2021 04:32:14.788 PM'