3

NTP タイムスタンプを utc に変換する最も簡単な方法は何ですか? NTP であることはわかっています。他の形式に変換できます。

ありがとう。ボブ。

4

3 に答える 3

19

rene が指摘したように、NTP タイムスタンプは整数部分と小数部分で構成されています。整数部分は、基準時刻 (1900 年 1 月 1 日) からの秒数を表します。小数部分は、秒の小数単位 (単位は 1/((2^32)-1)) の数を表します。

また、時間表現は UTC です。

したがって、たとえば 14236589681638796952 の NTP タイムスタンプがあるとします。NTP は 64 ビットの符号なし固定小数点数です。言うことが出来る:

UInt64 ntpTimestamp = 14236589681638796952;

上位 32 ビットは次の式で与えられます。

UInt32 秒 = (UInt32)((ntpTimestamp >> 32) & 0xFFFFFFFF);

下位 32 ビットは次の式で与えられます。

UInt32 分数 = (UInt32)(ntpTimestamp & 0xFFFFFFFF);

秒数は最上位の単語に等しいか、この場合は秒 == 3314714339 です。

ミリ秒数は、次の計算を使用して分数から計算できます。

Int32 ミリ秒 = (Int32)(((Double)fraction / UInt32.MaxValue) * 1000);

この場合は 12 です。

したがって、DateTime 値は次から得られます。

DateTime BaseDate = new DateTime(1900, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

DateTime dt = BaseDate.AddSeconds(秒).AddMilliseconds(ミリ秒);

したがって、14236589681638796952 の NTP タイムスタンプは、2005 年 1 月 14 日の 17:58:59 および 12 ミリ秒の UTC に等しくなります。

于 2011-05-03T06:23:52.433 に答える
0

このようなことを試してみませんか?その「1900 年 1 月 1 日からの秒数」の形式についてはわかりませんが、必要に応じて変更できます。

long ntp = 3490905600; 
DateTime start = new DateTime(1900, 1, 1);
DateTime dt = start.AddSeconds(ntp);

Console.WriteLine(dt.ToString());
Console.WriteLine(dt.ToUniversalTime().ToString()); 
于 2011-03-05T21:50:10.417 に答える