NTP 시간을 날짜로 변환 할 때 1 일 오프셋

Jesper Evertsson

내 자신의 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

날짜를 유닉스 타임 스탬프로 변환 할 때 1 시간 추가

분류에서Dev

Glyphter.com을 사용하여 SVG를 글꼴로 변환 할 때 오프셋-오프셋

분류에서Dev

POSIXct로 변환 할 때 오류 : 일부 날짜가 NA를 반환 함

분류에서Dev

Jackson은 JodaTime으로 역 직렬화 할 때 날짜에서 시간 오프셋을 잃습니다.

분류에서Dev

문자열을 날짜로 변환 할 때 로케일 언어 문제

분류에서Dev

문자열에서 날짜 시간을 변환 할 때 오류 메시지 변환 실패

분류에서Dev

문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패라는 오류 메시지

분류에서Dev

Epoch 시간을 올바른 날짜로 변환 할 때 발생하는 문제

분류에서Dev

SQL 오류, 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패

분류에서Dev

"문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패"오류

분류에서Dev

문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패-SQL Server 오류

분류에서Dev

저장 프로 시저의 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환에 실패했습니다.

분류에서Dev

날짜를 Epoch 초로 변환 할 때 순간 시간대에서 잘못된 값 가져 오기

분류에서Dev

POSIXct 날짜-시간을 날짜로 변환 할 때 예상치 못한 날짜-시간대를 수정할 수 있습니까?

분류에서Dev

날짜 형식을 다른 형식으로 변환 할 때 오류 발생

분류에서Dev

문자열을 날짜로 변환 할 때 dateFromString에서 nil 가져 오기

분류에서Dev

오프셋 비교를 통해 UTC 시간을 로컬 날짜 시간으로 변환하는 XSL

분류에서Dev

오프셋을 사용하여 Json 날짜를 Java 날짜로 변환

분류에서Dev

마지막 파일 수정 시간은 DST 변경 이후 1 년 오프셋을 반환합니다.

분류에서Dev

varchar를 날짜 ddmmyyyy로 변환 할 때 오류 발생

분류에서Dev

오프셋을 사용하여 로컬 날짜 시간을 GMT로 변환하는 방법

분류에서Dev

csv 파일에서 날짜 형식을 변환 할 때 "잘못된 날짜"오류 메시지가 표시됩니까? -껍질

분류에서Dev

문자열에서 날짜 및 / 또는 시간을 변환 할 때 메시지 241, 수준 16, 상태 1, 줄 6 변환에 실패했습니다.

분류에서Dev

문자열에서 날짜 및 / 또는 시간을 변환 할 때 메시지 241, 수준 16, 상태 1, 줄 6 변환에 실패했습니다.

분류에서Dev

날짜 시간을 1-24 시간으로 변환

분류에서Dev

타임 스탬프로 변환 할 때 날짜 변환 잘못된 날짜를 반환

분류에서Dev

날짜, 시간 및 UTC 오프셋을 로컬 DateTime으로 변환하는 방법

분류에서Dev

LatLong을 UTM으로 변환하고, 오프셋을 UTM에 추가하고, 오프셋 UTM을 다시 LatLong으로 변환 할 때 가능한 영역 변경을 처리하는 방법은 무엇입니까?

분류에서Dev

날짜-시간 열을 날짜 및 시간 변수로 분할

Related 관련 기사

  1. 1

    날짜를 유닉스 타임 스탬프로 변환 할 때 1 시간 추가

  2. 2

    Glyphter.com을 사용하여 SVG를 글꼴로 변환 할 때 오프셋-오프셋

  3. 3

    POSIXct로 변환 할 때 오류 : 일부 날짜가 NA를 반환 함

  4. 4

    Jackson은 JodaTime으로 역 직렬화 할 때 날짜에서 시간 오프셋을 잃습니다.

  5. 5

    문자열을 날짜로 변환 할 때 로케일 언어 문제

  6. 6

    문자열에서 날짜 시간을 변환 할 때 오류 메시지 변환 실패

  7. 7

    문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패라는 오류 메시지

  8. 8

    Epoch 시간을 올바른 날짜로 변환 할 때 발생하는 문제

  9. 9

    SQL 오류, 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패

  10. 10

    "문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패"오류

  11. 11

    문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패-SQL Server 오류

  12. 12

    저장 프로 시저의 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환에 실패했습니다.

  13. 13

    날짜를 Epoch 초로 변환 할 때 순간 시간대에서 잘못된 값 가져 오기

  14. 14

    POSIXct 날짜-시간을 날짜로 변환 할 때 예상치 못한 날짜-시간대를 수정할 수 있습니까?

  15. 15

    날짜 형식을 다른 형식으로 변환 할 때 오류 발생

  16. 16

    문자열을 날짜로 변환 할 때 dateFromString에서 nil 가져 오기

  17. 17

    오프셋 비교를 통해 UTC 시간을 로컬 날짜 시간으로 변환하는 XSL

  18. 18

    오프셋을 사용하여 Json 날짜를 Java 날짜로 변환

  19. 19

    마지막 파일 수정 시간은 DST 변경 이후 1 년 오프셋을 반환합니다.

  20. 20

    varchar를 날짜 ddmmyyyy로 변환 할 때 오류 발생

  21. 21

    오프셋을 사용하여 로컬 날짜 시간을 GMT로 변환하는 방법

  22. 22

    csv 파일에서 날짜 형식을 변환 할 때 "잘못된 날짜"오류 메시지가 표시됩니까? -껍질

  23. 23

    문자열에서 날짜 및 / 또는 시간을 변환 할 때 메시지 241, 수준 16, 상태 1, 줄 6 변환에 실패했습니다.

  24. 24

    문자열에서 날짜 및 / 또는 시간을 변환 할 때 메시지 241, 수준 16, 상태 1, 줄 6 변환에 실패했습니다.

  25. 25

    날짜 시간을 1-24 시간으로 변환

  26. 26

    타임 스탬프로 변환 할 때 날짜 변환 잘못된 날짜를 반환

  27. 27

    날짜, 시간 및 UTC 오프셋을 로컬 DateTime으로 변환하는 방법

  28. 28

    LatLong을 UTM으로 변환하고, 오프셋을 UTM에 추가하고, 오프셋 UTM을 다시 LatLong으로 변환 할 때 가능한 영역 변경을 처리하는 방법은 무엇입니까?

  29. 29

    날짜-시간 열을 날짜 및 시간 변수로 분할

뜨겁다태그

보관