ミリ秒の精度で実際の時間のタイムスタンプを正確に作成するにはどうすればよいですか?
16.4.2013 9:48:00:123のようなものが必要です。これは可能ですか?1秒あたり10回値をサンプリングするアプリケーションがあり、それらをグラフに表示する必要があります。
hh
時間(標準時間)使用されていることに注意してください。タイムスタンプの場合(および他の多くの場合)、これはtt
(am / pm)とペアにするか、HH
(ミリタリータイム)に置き換える必要があります。
ミリ秒の精度で実際の時間のタイムスタンプを正確に作成するにはどうすればよいですか?
16.4.2013 9:48:00:123のようなものが必要です。これは可能ですか?1秒あたり10回値をサンプリングするアプリケーションがあり、それらをグラフに表示する必要があります。
hh
時間(標準時間)使用されていることに注意してください。タイムスタンプの場合(および他の多くの場合)、これはtt
(am / pm)とペアにするか、HH
(ミリタリータイム)に置き換える必要があります。
回答:
ミリ秒の精度で実際の時間のタイムスタンプを正確に作成するにはどうすればよいですか?
ミリ秒の精度だと思います。DateTime
精度は高いですが、精度に関してはかなり粗いです。一般的に言えば、それはできません。通常、システムクロック(DateTime.Now
データを取得する場所)の分解能は約10〜15 msです。詳細については、精度と正確性に関する Eric Lippertのブログ投稿を参照してください。
これよりも正確なタイミングが必要な場合は、NTPクライアントの使用を検討してください。
ただし、ここで本当にミリ秒の精度が必要かどうかは明らかではありません。正確なタイミングを気にしない場合-「かなり良い」精度で正しい順序でサンプルを表示したい場合は、システムクロックで十分です。DateTime.UtcNow
ではなく使用することをお勧めしますDateTime.Now
夏時間の移行などの周りのタイムゾーンの問題を回避するために、しかし
あなたの質問が実際DateTime
にaをミリ秒の精度の文字列に変換することに関する場合、私は以下を使用することをお勧めします:
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture);
(サンプルとは異なり、これは並べ替え可能であり、「月/日/年」と「日/月/年」のどちらを意味するのかについて混乱を招く可能性が低いことに注意してください。)
DateTime.UtcNow
繰り返しヒットすると、毎秒1回しか増加しませんか?表示していません。)
これはうまくいくはずです:
DateTime.Now.ToString("hh.mm.ss.ffffff");
表示する必要がなく、時差だけを知る必要がある場合は、文字列に変換しないでください。そのままにしておきますDateTime.Now();
そして使う TimeSpan
時間間隔の違いを知るためにします。
例
DateTime start;
TimeSpan time;
start = DateTime.Now;
//Do something here
time = DateTime.Now - start;
label1.Text = String.Format("{0}.{1}", time.Seconds, time.Milliseconds.ToString().PadLeft(3, '0'));
私はこのスレッドで提案されたものに基づいて同様の解決策を探していました、私は以下を使用し、
DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff")
それは魅力のように機能します。注:これ.fff
は、取得する精度の数値です。
パイロマンサーの答えは私にはかなり良いようですが、あなたが望んでいたのかもしれません:
DateTime.Now.Millisecond
ただし、日付を比較する場合は、TimeSpanが適しています。
TotalMilliseconds
です。Millisecondsは現在のMillisecondsカウンターを保持します。これは1000を超えることはありませんが、TotalMillisecondsはエポックから経過した合計ミリ秒を保持します。
私が質問を理解している限り、あなたは行くことができます:
DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000);
これにより、1ミリ秒未満のティックがカットされます。
で問題DateTime.UtcNow
とDateTime.Now
コンピュータとオペレーティングシステムに依存し、それはわずか10〜15ミリ秒に正確であってもよい、ということです。ただし、Windowsコンピューターでは、低レベルの関数GetSystemTimePreciseAsFileTimeを使用してマイクロ秒の精度を得ることができGetTimeStamp()
ます。以下の関数を参照してください。
[System.Security.SuppressUnmanagedCodeSecurity, System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern void GetSystemTimePreciseAsFileTime(out FileTime pFileTime);
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct FileTime {
public const long FILETIME_TO_DATETIMETICKS = 504911232000000000; // 146097 = days in 400 year Gregorian calendar cycle. 504911232000000000 = 4 * 146097 * 86400 * 1E7
public uint TimeLow; // least significant digits
public uint TimeHigh; // most sifnificant digits
public long TimeStamp_FileTimeTicks { get { return TimeHigh * 4294967296 + TimeLow; } } // ticks since 1-Jan-1601 (1 tick = 100 nanosecs). 4294967296 = 2^32
public DateTime dateTime { get { return new DateTime(TimeStamp_FileTimeTicks + FILETIME_TO_DATETIMETICKS); } }
}
public static DateTime GetTimeStamp() {
FileTime ft; GetSystemTimePreciseAsFileTime(out ft);
return ft.dateTime;
}
datetime.now.ticksを使用してみてください。これはナノ秒の精度を提供します。2ティックの差分(stoptick-starttick)/ 10,000は、指定された間隔のミリ秒です。
https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netframework-4.7.2