내 자신의 NTP 클라이언트를 구현하려고합니다.
NTP 메시지를 보내고받을 수 있으며 지금해야 할 일은 "실시간"으로 변환하는 것입니다. 이 작업을 수행하는 함수를 만들었지 만 어떤 이유로 1 일 뒤인 요일 필드를 제외하고 모든 필드가 정확합니다.
나는 또한 펜, 종이, 계산기로 몇 가지 빠른 계산을했고 같은 결과를 얻었으므로 내가 놓친 것이 틀림 없다.
내 코드는 다음과 같습니다.
void setTime(uint32_t seconds, uint32_t fraction)
{
int yearsPassed = seconds / (60 * 60 * 24 * 365);
year = 1900 + yearsPassed;
int leapYears = yearsPassed / 4;
int secondsLeft = seconds - yearsPassed * 365 * 24 * 60 * 60;
secondsLeft -= leapYears * 60 * 60 * 24;
int daysPassed = secondsLeft / (60 * 60 * 24);
secondsLeft -= daysPassed * 60 * 60 * 24;
int hoursPassed = secondsLeft / (60*60);
secondsLeft -= hoursPassed * 60 * 60;
int minutesPassed = secondsLeft / 60;
secondsLeft -= minutesPassed * 60;
hour = hoursPassed + SUMMERTIME_OFFSET;
minute = minutesPassed;
second = secondsLeft;
us = (fraction * (pow((float)10,(float)6)) / (pow((float)2,(float)32)));
month = getMonth(daysPassed);
day = getDay(month, daysPassed);
}
이 코드를 사용하면 예를 들어 2015/4/28 14 : 3 : 15.351731 시간을 얻을 수 있지만 날짜는 28이 아니라 29 여야합니다. 처음에는 윤년을 잘못 계산하고 그로부터 1 일이 빠졌다고 생각했지만 올바른 것 같습니다.
편집하다
getMonth () 및 getDay ()에 대한 코드입니다. 작동하는지 테스트하기 위해 가능한 한 적은 코드를 작성하고 싶었 기 때문에 아직 완전히 구현되지 않았습니다.
int getMonth(int daysPassed)
{
if (daysPassed < 32)
return 1;
else if (daysPassed < 60)
return 2;
else if (daysPassed < 91)
return 3;
else if (daysPassed < 121)
return 4;
else if (daysPassed < 152)
return 5;
else
return 6;
}
int getDay(int month, int daysPassed)
{
switch (month)
{
case 1:
return daysPassed;
break;
case 2:
return daysPassed - 31;
break;
case 3:
return daysPassed - 59;
break;
case 4:
return daysPassed - 90;
break;
case 5:
return daysPassed - 120;
break;
default:
return 6;
break;
}
}
부분 일 수가 아니라 완료된 일 daysPast
수이므로 에 fencepost 오류가 발생합니다 .
1/1/1900 00:00:01로 해석되어야하는 1 초의 입력을 고려하십시오 (좋아요, 더 좋게는 단위 테스트로 만드십시오)- daysPast
지난 일 수는 0으로 제공 됩니다. 현재 날짜를 고려하지 않습니다.
물론 연중 일을 계산할 때 현재 연도가 윤년인지 여부도 고려해야합니다. 완전성과 호환성을 위해 2100 년의 윤년 알고리즘은 아주 순진합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다