2011-03-05 898 views
1

将NTP时间戳转换为utc最简单的方法是什么?我知道它在NTP中,我可以将它转换成任何其他格式。将NTP时间戳转换为utc

谢谢。 鲍勃。

+0

你有一个样品的输入? – 2011-03-05 21:43:14

+1

根据这个链接http://souptonuts.sourceforge.net/readme_working_with_time.html自01-01-1990以来的秒数在长ntp的高阶整数中。 – rene 2011-03-05 21:48:09

回答

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()); 
+0

谢谢。我刚回来自己回答。 – 2011-03-05 21:58:49

15

正如rene指出的那样,NTP时间戳由一个整数和一个小数部分组成。整数部分表示从基准时间开始的秒数,即1900年1月1日。小数部分表示小数单位的数量(单位为1 /((2^32)-1))。

此外,时间表示法是UTC。

因此,如果你有一个NTP时间戳,比如14236589681638796952。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 BaseDate =新日期时间(1900年,1,1,0,0,0,0,DateTimeKind.Utc);

DateTime dt = BaseDate.AddSeconds(seconds).AddMilliseconds(milliseconds);

因此,14236589681638796952的NTP时间戳等于2005年1月14日17:58:59和12毫秒UTC。

0

这个工作可靠,对我来说:

#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 ;