時間をミリ秒単位で取得する必要があるプログラムを作成しています。時間によって、それ自体と決して等しくなることのない数を意味し、常に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.Now頻繁に「更新」されない場合でも)、もちろんdecimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;代わりに使用してください。
                    long、ミリ秒の前にデータ型が表示されました。int確かに使用するとオーバーフローします。
                    DateTime.Ticksプロパティは、日付と時刻を表すティック数を取得します。
10,000ティックは1ミリ秒です(1秒あたり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()ます。これにより、読み取り値が既知の参照ベースのミリ秒形式になり、日の変更などが完全に排除されます。