C# 4.0 将NTP时间戳转换为utc
将NTP时间戳转换为utc的最简单方法是什么。我知道它是NTP格式的,我可以把它转换成任何其他格式 谢谢。C# 4.0 将NTP时间戳转换为utc,c#-4.0,ntp,C# 4.0,Ntp,将NTP时间戳转换为utc的最简单方法是什么。我知道它是NTP格式的,我可以把它转换成任何其他格式 谢谢。 鲍勃。试试这样的吗?我不确定“1900年1月1日以来的秒数”的格式,但您可以根据需要进行修改 long ntp = 3490905600; DateTime start = new DateTime(1900, 1, 1); DateTime dt = start.AddSeconds(ntp); Console.WriteLine(dt.ToString()); Console.Wr
鲍勃。试试这样的吗?我不确定“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());
正如rene指出的,NTP时间戳由整数和小数部分组成。整数部分表示自基准时间(1900年1月1日)起的秒数。小数部分表示秒中的小数单位数(单位为1/((2^32)-1)) 此外,时间表示法为UTC 因此,如果您的NTP时间戳为14236589681638796952。NTP是一个64位无符号定点数字。我们可以说: UInt64 ntpTimestamp=14236589681638796952 高32位由以下公式给出: UInt32秒=(UInt32)((ntpTimestamp>>32)和0xffffff) 低32位由下式给出: UInt32分数=(UInt32)(ntpTimestamp&0xFFFFFFFF) 以秒为单位的数字等于最重要的字,或者在这种情况下: 秒==3314714339 可以使用以下计算从分数计算毫秒数: Int32毫秒=(Int32)((双)分数/UInt32.MaxValue)*1000) 在这种情况下是12 因此,DateTime值由以下公式得出: DateTime BaseDate=新的日期时间(1900,1,1,0,0,0,DateTimeKind.Utc) DateTime dt=BaseDate.AddSeconds(秒).addmillizes(毫秒)
因此,NTP时间戳14236589681638796952等于2005年1月14日UTC时间17:58:59和12毫秒。这对我来说是可靠的:
#define NTP_TIMESTAMP_DIFF (2208988800) // 1900 to 1970 in seconds
#define NTP_MAX_INT_AS_DOUBLE (4294967295.0) // Max value of frac
// take care of the endianness
reply_pkt.tx_time_sec = ntohl( reply_pkt.tx_time_sec ) ;
reply_pkt.tx_time_frac = ntohl( reply_pkt.tx_time_frac ) ;
// parse
time_t tx_time = ( time_t ) ( reply_pkt.tx_time_sec - NTP_TIMESTAMP_DIFF );
double frac = ((double)reply_pkt.tx_time_frac) / NTP_MAX_INT_AS_DOUBLE ; // 2^32 -1
struct tm *tm = gmtime(&tx_time) ;
char ts[49];
strftime(ts,48,"[%Y-%m-%d %H:%M:%S]",tm);
printf("NTP query: reply was %s\n",ts);
ntp_time_seconds = ((double)tx_time) + frac ;
根据该链接,自1990年1月1日起的秒数为长ntp的高阶整数。谢谢。我只是回来亲自回答。