2011-03-05 5 views
1

NTP 시간 소인을 utc로 변환하는 가장 쉬운 방법은 무엇입니까? 나는 그것이 NTP에 있다는 것을 알고, 다른 형식으로 변환 할 수 있습니다.NTP 시간 소인을 utc로 변환

감사합니다. Bob.

+0

당신은 샘플 입력이 있습니까? –

+1

이 링크 http://souptonuts.sourceforge.net/readme_working_with_time.html에 따르면 01-01-1990 년 이래로 초가 긴 ntp의 하이라이트 int에 있습니다. – rene

답변

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

감사. 방금 나 자신에게 대답하기 위해 돌아왔다. –

15

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

초 안의 숫자는 가장 중요한 단어 또는이 경우와 동일하다 :

: 밀리 초는 다음 공식을 사용하여 계산 분율로부터 계산 될 수 3,314,714,339

초 ==

Int32 milliseconds = (Int32) (((소수)/UInt32.MaxValue) * 1000);

이 경우 12입니다.

따라서,이 시간 값으로부터 산출된다

날짜 시간 BaseDate = 새로운 날짜 시간 (1900, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

DateTime dt = BaseDate.AddSeconds (초) .AddMilliseconds (밀리 초);

따라서 NTP 타임 스탬프 인 14236589681638796952는 2005 년 1 월 14 일 17:58:59 및 UTC 12 밀리 초와 같습니다.

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 ;