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


231

ミリ秒の精度で実際の時間のタイムスタンプを正確に作成するにはどうすればよいですか?

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



多くの回答が数hh時間(標準時間)使用されていることに注意してください。タイムスタンプの場合(および他の多くの場合)、これはtt(am / pm)とペアにするか、HH(ミリタリータイム)に置き換える必要があります。
GoNZ

回答:


304

ミリ秒の精度で実際の時間のタイムスタンプを正確に作成するにはどうすればよいですか?

ミリ秒の精度だと思います。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);

(サンプルとは異なり、これは並べ替え可能であり、「月/日/年」と「日/月/年」のどちらを意味するのかについて混乱を招く可能性が低いことに注意してください。)


5
@antonio:「機能しない」以外の情報がないと、これ以上のヘルプは提供できません。
Jon Skeet、2018

はい、詳細情報を提供できます:「{0:yyyyMMdd HH:mm:ss.fff}」、DateTime.UtcNow-> 20180502 11:07:20.000 Win32.GetSystemTime(ref stime)-> 2018,2,5,11 、7,20,0(ymdh mm ss ms)ミリ秒の日付時刻のインスタンスを作成できます。vardt = new DateTime(2018、5、2、19、34、55、200); 「{0:yyyyMMdd HH:mm:ss.fff}」、dt-> 20180502 19:34:55.200 .Netコンパクトフレームワーク、Windows Embedded Compact 7、ARM Cortex-A8上
antonio

@antonio:つまり、使用しているハードウェアで使用している.NETのバージョンでは、サブセカンド精度が提供されないようです。(DateTime.UtcNow繰り返しヒットすると、毎秒1回しか増加しませんか?表示していません。)
Jon Skeet

DateTime.Nowからティックを取得すると、値が切り捨てられます:Ticks 636534596580000000 DateTime from Ticks 20180205 20:34:18.000。制限はハード/ソフトウェアにあると思います。私は代わりにストップウォッチクラスを使用しています。ありがとうJon
antonio

@antonio:この時点で関連するデバイスの完全な詳細を含む新しい質問を作成することはおそらく価値があります。
Jon Skeet、2018

117

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

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

計算が必要なので、文字列に変換できません。
LuckyHK 2013

25

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


1
日付が午後(4PM)の場合は、午前のように表示されます。修正:使用HH(軍事時間)または追加tt(午後または午前)。この例に示すように:repl.it/KGr3/1
Jaider

22

DateTime構造をミリ秒で使用し、次のような形式にします。

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

16

パイロマンサーの答えは私にはかなり良いようですが、あなたが望んでいたのかもしれません:

DateTime.Now.Millisecond

ただし、日付を比較する場合は、TimeSpanが適しています。


15
注:2つのDateTimeの差をTimeSpanとして比較する場合は、が必要TotalMillisecondsです。Millisecondsは現在のMillisecondsカウンターを保持します。これは1000を超えることはありませんが、TotalMillisecondsはエポックから経過した合計ミリ秒を保持します。
Contango 2014

4

他の回答のような文字列ではなく日付が必要な場合は、この拡張メソッドを追加するだけです。

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

私が質問を理解している限り、あなたは行くことができます:

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

これにより、1ミリ秒未満のティックがカットされます。


はい。ただし、DateTime.Nowの実際の解像度は約16ミリ秒を超えない場合があります。
Peter Mortensen

2

で問題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;
    }

どうもありがとうございます。私はこれをずっと探し続けてきました。それはパフォーマンスの問題を引き起こしますか?本番コードを使用しても安全ですか?
MuhammetGöktürkAyan


-2
public long millis() {
  return (long.MaxValue + DateTime.Now.ToBinary()) / 10000;
}

マイクロ秒が必要な場合は、に変更10000します。マイクロ秒10の10分の1が必要な場合は、を削除し/ 10000ます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.