2011-03-05 910 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 ;