2012-02-17 8 views
-4

私は、次の形式で正確な現在時刻を取得したい: HH:MM:SS:MMM正確な時刻を取得する方法DateTime.Now.TimeOfDay?

HH - 時間

MM - 分

SS - 秒

MMM - ミリ秒

は、私の知る限りではDateTime.Nowは十分に正確ではありません、ストップウォッチだけの時間を測定するためのものです。 精度が1ミリ秒になりたい。

+5

「正確」を定義し、ユースケースを説明してください。 – Oded

+0

'timeBeginPeriod'を使うと'精度の定義方法によっては 'DateTime.Now'に1msの精度を与えることができます。しかし、おそらく、正しい時刻の1ms以内にはないでしょう。 – CodesInChaos

+0

正確度は、ミリ秒単位で3桁の精度を持つタイムスタンプです。 – remi

答えて

3

ここで問題になっているのは、DateTimeは非常に正確な時間結果を提供しますが、正確さはシステムのハードウェアクロックと、OSが時間要求に応答する速度の両方によって左右されますt。

精度と精度は同じように見えるかもしれませんが、そうではありません。 10億分の1メートルまでの測定値を書き込むことができるかもしれませんが、測定デバイスの目盛りが1メートルでなければ、精度は1メートルしかありません。

正確に1ミリ秒までの時間が必要な場合は、別の時間ソースが必要になります。この時間ソースを直接ポーリングすると、OSの遅延が回避されます。

リアルタイムクロックに接続できるデバイス、たとえばgpsレシーバ(高精度)を取得することは可能です。再び、2つの受信機間の正確さは、それらが衛星から同じ距離にあるかどうかに依存する。

+0

最新のPCには正確な時間の2つの他の情報源があります。 HPETとRDTC。カーネルティックには依存しません。 90年代の終わり(私が間違っていなければRTCを読む前に)とにかくカーネルティックはHPETを読みます。 RDTCはQueryPerformanceCounterで使用されるタイマーです(実際にはACPIに依存するためほとんどの場合)。 CPUのレジスタなので、ナノ秒が保証されます。 –

1

実際、resolution of DateTimeは実際には100ナノ秒の解像度にまで下がりますが(解像度は実装によって制限されますが)、ミリ秒の解像度は問題ではありません。

あなたはあなたの問題を解決するために必要なすべてのプロパティは、通常のDateTimeタイプでご利用いただけます。

編集:@CodeInChaosが指摘するように、でも、ミリ秒の解像度は、あなたが実際にその解像度が必要な場合、それは良いですので、このAPIを使用して保証されません: -/

+0

1msの精度が問題です。 「DateTime.Now」の背後にあるWindows APIは、システムタイマーの精度でのみ動作します。システムタイマーは1ms〜16msの間で変化します。あなたにそのような値を与える時計がないなら、 'DateTime'が100nsを表すことができることは重要ではありません。 – CodesInChaos

+0

@ CodeInChaos非常に興味深い、私はそれを知らなかった。もっと情報を教えていただけますか? –

+0

http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx "このプロパティの解決はシステムタイマーによって異なります。"そして、システムタイマーは 'timeBeginPeriod'によって影響を受ける可能性があります。 – CodesInChaos

0

WindowsのマルチメディアタイマtimeGetTime()

粒度:1ミリ秒 精度:1ミリ秒 見かけ精度:2.32804262366679e-006秒 見かけジッタ:1.19727906360006e-007秒here

からリッピング

+0

は、グローバル(システムワイド)カーネルチックを1ms前に設定した場合にのみ有効です。それは最小限の制限であり、デフォルトは15msであり、正当な理由からです。 CPUウェイクアップ、無駄な割り込みペイロード... –

関連する問題