NTP 시간 소인을 utc로 변환하는 가장 쉬운 방법은 무엇입니까? 나는 그것이 NTP에 있다는 것을 알고, 다른 형식으로 변환 할 수 있습니다.NTP 시간 소인을 utc로 변환
감사합니다. Bob.
NTP 시간 소인을 utc로 변환하는 가장 쉬운 방법은 무엇입니까? 나는 그것이 NTP에 있다는 것을 알고, 다른 형식으로 변환 할 수 있습니다.NTP 시간 소인을 utc로 변환
감사합니다. Bob.
다음과 같이 시도해보십시오. 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());
감사. 방금 나 자신에게 대답하기 위해 돌아왔다. –
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 밀리 초와 같습니다.
이 나를 위해, 안정적으로 작동 :
#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 ;
당신은 샘플 입력이 있습니까? –
이 링크 http://souptonuts.sourceforge.net/readme_working_with_time.html에 따르면 01-01-1990 년 이래로 초가 긴 ntp의 하이라이트 int에 있습니다. – rene