我正在编写一个程序,其中需要以毫秒为单位。到时间,我的意思是一个永远不会等于自己的数字,并且总是比第二秒大1000个数字。我试过转换DateTime.Now
为a TimeSpan
并TotalMilliseconds
从中获取...,但我听说它并不十分准确。
有没有更简单的方法可以做到这一点?
我正在编写一个程序,其中需要以毫秒为单位。到时间,我的意思是一个永远不会等于自己的数字,并且总是比第二秒大1000个数字。我试过转换DateTime.Now
为a TimeSpan
并TotalMilliseconds
从中获取...,但我听说它并不十分准确。
有没有更简单的方法可以做到这一点?
Answers:
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
肯定会溢出。
该DateTime.Ticks
属性获取代表日期和时间的刻度数。
10,000滴答声是毫秒(每秒10,000,000滴答声)。
A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.
我使用以下课程。我曾经在互联网上找到它,它被认为是最好的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#中获取刻度精度的时间戳?想要查询更多的信息。
Stopwatch.GetTimestamp()
可以访问此方法:
public static long GetTimestamp() {
if(IsHighResolution) {
long timestamp = 0;
SafeNativeMethods.QueryPerformanceCounter(out timestamp);
return timestamp;
}
else {
return DateTime.UtcNow.Ticks;
}
}
Stopwatch.GetTimestamp()
实际上提供了对该方法的访问。
我使用了DateTime.Now.TimeOfDay.TotalMilliseconds(用于当前日期),希望对您有所帮助。
使用System.DateTime.Now.ToUniversalTime()
。这样一来,您的阅读就可以采用已知的基于参考的毫秒格式,从而完全消除了日期变更等问题。