C#を使用してミリ秒単位で時間を取得する


131

時間をミリ秒単位で取得する必要があるプログラムを作成しています。時間によって、それ自体と決して等しくなることのない数を意味し、常に1秒前よりも1000大きい数です。に変換DateTime.NowTimeSpanTotalMillisecondsそこから取得しようとしましたが、完全に正確ではないと聞きました。

これを行う簡単な方法はありますか?


2つの呼び出しが常に増加する価値をリードすると期待していますか?一般に、タイマー解決が許可する最小間隔よりも近い呼び出しは、同じ値になります。偽精度のシリアライザーの形で独自のタイブレーカーを追加する必要があります。
Steven Sudit、

16
「それ自体と決して等しくない数」。複雑そうですね。;)
Mizipzor 2012

1
NaNは実際にその要件に適合します。「数ではない」にもかかわらず、それは数のタイプであり、それ自体とは異なります。
Yay295

回答:


78

Stopwatchクラスを使用します。

経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。

ここにそれを実装することに関するいくつかの良い情報があります:

パフォーマンステスト:System.Diagnostics.Stopwatchによる正確なランタイム測定


8
ストップウォッチは診断の一部です。実際のコードで使用する必要がありますか?
Andrey、


これは通常、最も近い15ms程度までしか正確ではありません。
Steven Sudit、

11
それはどれくらい高いですか?ストップウォッチをストップウォッチにする必要があるかもしれません:)
jb。

3
@Steven、それはOSと基盤となるハードウェアに依存します。利用可能な場合、高解像度タイマーが使用されます。これは、私が知っているすべての現在のデスクトップおよびサーバーベースのx86 Windowsバージョンの場合です。詳細については、FrequencyプロパティとIsHighResolutionプロパティを確認してください。OSレベルでは、QueryPerformanceCounterとQueryPerformanceFrequencyは、この機能をサポートする低レベルのAPIです。
Chris Taylor、

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

これは実際に、さまざまなUnix変換メソッドがDateTimeOffsetクラスに実装されている方法です(.NET Framework 4.6以降、.NET Standard 1.3以降)。

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

65
タイトルは「ミリ秒単位で時間を取得」です。この答えは役に立ちます。
Aerospace、

33
うん、私たちが提起された質問への回答を探しているそれらにとって、これは非常に役に立ちました、ありがとう。
user430788 14

1
小数が必要な場合(たとえDateTime.Now頻繁に「更新」されない場合でも)、もちろんdecimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;代わりに使用してください。
Jeppe Stig Nielsen

1
これは、検索結果や、元の質問から収集したものに対して、選択した回答よりもはるかに便利です。
bwoogie 2016

1
この答えは私の命を救った。同様のコードを取得しましたが、機能しません。理由がわかりませんでした。次にlong、ミリ秒の前にデータ型が表示されました。int確かに使用するとオーバーフローします。
FisNaN 2018年

13

DateTime.Ticksプロパティは、日付と時刻を表すティック数を取得します。

10,000ティックは1ミリ秒です(1秒あたり10,000,000ティック)。


4
ただし、ティックの解像度は1/10000秒よりかなり低く、おそらく
1/62秒です

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.
Karo

5
確かにそうですが、オペレーティングシステムにはこれほど正確な解決策がありません。
codymanix

6
@codymanixは正しいです。類推すると、オングストロームは長さの単位です。100億オングストロームで1メートルになります。高さを64ビットの整数としてオングストロームで報告する関数を書くこともできますが、センチメートルに正確なメータースティックしかなければ、関数がサブナノメートルの精度を表すという事実はまったく関係ありません。重要度の低い数字はゴミになります。
Eric Lippert

4
@RedFilter:実際に最も近いミリ秒単位で年齢を知っている場合、「もう一度点滅すると、私の年齢はxミリ秒になります」のように言うことができます。より深い問題はコミュニケーションではなく測定です。あなたの出生は、最も近い秒まで知られていないようです。
Steven Sudit、

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ストップウォッチは、可能であれば内部的にQueryPerformanceCounterを使用します
codymanix

うん、の内部実装はStopwatch.GetTimestamp()実際にそのメソッドへのアクセスを提供します。
Pieter van Ginkel、

5

私はDateTime.Now.TimeOfDay.TotalMilliseconds(当日)を使用しました。


1
TimeOfDayは毎日午前0時にゼロにリセットされるため、(元のポスターのように)増加する値を返しません。さらに、DateTime.Nowを使用しただけでポスターから言及されたのと同じ潜在的な問題が発生し、そこから合計ミリ秒が取得されます。
ジム・オニール2012

3
ジム・オニール私はuに同意します、それが私が私の投稿で「(当日)」と述べた理由です...ところで、私の問題は日付に固有ではないので、私は単にミリ秒の部分をカウンターとして使用するため、ここに投稿しました。私はここに新しいので、間違った場所に投稿した場合、申し訳ありません:)
Sarvan

2

を使用しSystem.DateTime.Now.ToUniversalTime()ます。これにより、読み取り値が既知の参照ベースのミリ秒形式になり、日の変更などが完全に排除されます。


知っておくとよいが、正確な時間の伝達ではなく、タイミング(時間の経過の測定)に関する質問とは関係ありません。
ToolmakerSteve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.