NTP タイムスタンプを utc に変換する最も簡単な方法は何ですか? NTP であることはわかっています。他の形式に変換できます。
ありがとう。ボブ。
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 に等しくなります。
このようなことを試してみませんか?その「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());