ミリ秒の精度で実際の時刻のタイムスタンプを正確に作成する方法を教えてください。
16.4.2013 9:48:00:123のようなものが必要です。これは可能ですか?私は1秒間に10回値をサンプリングするアプリケーションを持っています、そしてそれらをグラフで表示する必要があります。
ミリ秒の精度で実際の時刻のタイムスタンプを正確に作成する方法を教えてください。
ミリ秒 精度 を意味するのではないかと思います。 DateTime
はかなりの精度を持ちますが、精度の点ではかなり粗いです。一般的に言えば、できません。通常、システムクロック(DateTime.Now
がデータを取得する場所)の分解能は約10-15 msです。詳細については、Eric Lippertの 精度と正確性に関するブログ投稿 を参照してください。
これより正確なタイミングが必要な場合は、NTPクライアントの使用を検討してください。
しかし、ここでミリ秒の精度が本当に必要であることは明らかではありません。 exact のタイミングを気にしないのであれば、サンプルを正しい順序で「かなり良い」精度で表示したいだけであれば、システムクロックは問題ないはずです。夏時間への移行などのタイムゾーンの問題を避けるために、DateTime.UtcNow
ではなくDateTime.Now
を使用することをお勧めします。
あなたの質問が 実際に である場合、DateTime
をミリ秒の精度で文字列に変換することをまわりに使用することをお勧めします。
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture);
(サンプルとは異なり、これはソート可能であり、「月/日/年」と「日/月/年」のどちらを意味するのかについて混乱を招く可能性が低くなります。)
これはうまくいくはずです。
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
はキャプチャしたい精度の数値です。
Pyromancer's answer /私にはかなり良いように思えるが、多分あなたは望んでいた:
DateTime.Now.Millisecond
あなたが日付を比較しているのであれば、TimeSpanは進むべき道です。
DateTime構造体をミリ秒と形式で使用します
string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");
私が質問を理解している限り、あなたは以下のために行くことができます。
DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000);
これは1ミリ秒未満の目盛りをカットします。
他の答えのように文字列ではなく日付がまだ必要な場合は、この拡張メソッドを追加してください。
public static DateTime ToMillisecondPrecision(this DateTime d) {
return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute,
d.Second, d.Millisecond, d.Kind);
}
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/ja-jp/dotnet/api/system.datetime.ticks?view=netframework-4.7.2