web-dev-qa-db-ja.com

ミリ秒の精度でDateTime.Nowを取得します。

ミリ秒の精度で実際の時刻のタイムスタンプを正確に作成する方法を教えてください。

16.4.2013 9:48:00:123のようなものが必要です。これは可能ですか?私は1秒間に10回値をサンプリングするアプリケーションを持っています、そしてそれらをグラフで表示する必要があります。

198
LuckyHK

ミリ秒の精度で実際の時刻のタイムスタンプを正確に作成する方法を教えてください。

ミリ秒 精度 を意味するのではないかと思います。 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);

(サンプルとは異なり、これはソート可能であり、「月/日/年」と「日/月/年」のどちらを意味するのかについて混乱を招く可能性が低くなります。)

268
Jon Skeet

これはうまくいくはずです。

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'));
104
Pyromancer

私はこのスレッドで提案されたものに基づいて、同様の解決策を探していました、私は以下のDateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff")を使います、そして、それは魅力のように働きます。注:.fffはキャプチャしたい精度の数値です。

22
Jozcar

Pyromancer's answer /私にはかなり良いように思えるが、多分あなたは望んでいた:

DateTime.Now.Millisecond

あなたが日付を比較しているのであれば、TimeSpanは進むべき道です。

16
Renae

DateTime構造体をミリ秒と形式で使用します

string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", 
CultureInfo.InvariantCulture);
timestamp = timestamp.Replace("-", ".");
13
Jacman

私が質問を理解している限り、あなたは以下のために行くことができます。

DateTime dateTime = DateTime.Now;
DateTime dateTimeInMilliseconds = dateTime.AddTicks(-1 * dateTime.Ticks % 10000); 

これは1ミリ秒未満の目盛りをカットします。

3
Roland Dietz

他の答えのように文字列ではなく日付がまだ必要な場合は、この拡張メソッドを追加してください。

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);
}
3
birch

DateTime.UtcNowDateTime.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;
    }
1
Stochastically

datetime.now.ticksを使ってみてください。これはナノ秒の精度を提供します。 2ティック(stoptick - starttick)/ 10,000のデルタをとることは、指定された間隔のミリ秒です。

https://docs.Microsoft.com/ja-jp/dotnet/api/system.datetime.ticks?view=netframework-4.7.2

0
darkstar