ミリ秒単位で時間を取得する必要があるプログラムを作成しています。時間によって、それ自体と等しくなることはなく、常に 1 秒前よりも 1000 大きい数値を意味します。に変換DateTime.Now
してからTimeSpan
を取得しようとしTotalMilliseconds
ましたが、完全に正確ではないと聞きました。
これを行う簡単な方法はありますか?
ミリ秒単位で時間を取得する必要があるプログラムを作成しています。時間によって、それ自体と等しくなることはなく、常に 1 秒前よりも 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.Ticks
プロパティは、日付と時刻を表すティック数を取得します。
10,000 ティックはミリ秒 (1 秒あたり 10,000,000 ティック) です。
私は次のクラスを使用します。インターネットで一度見つけたのですが、最高の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;
}
}
私は DateTime.Now.TimeOfDay.TotalMilliseconds (当日) を使用しました。
を使用しSystem.DateTime.Now.ToUniversalTime()
ます。これにより、読み取り値が既知の参照ベースのミリ秒形式になり、日の変更などが完全に排除されます。
あなたの要件を理解しているように、Environment.TickCountは法案に適合しています。起動からのミリ秒数を返すため、常に増加し、ミリ秒単位の経過時間の計算に使用できます。絶対時間も必要な場合は、現在の時間と現在の Environment.TickCount を取得し、それと新しい Environment.TickCount に基づいて新しい絶対時間を計算できます。