//---------------------------------------------------------------------------------------


const int jDaysInMonths[][13] =

{

    { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, },

    { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, },

};


const int daysIn400Years = 365 * 400 + 97;


#define isLeap(y) (((y) % 400 == 0) | ((y) % 100 && (y) % 4 == 0))

#define julianDay(y,m,d) (jDaysInMonths[isLeap(y)][m - 1] + d)


//----------------------------------------------------------------------------


void getDateAfterDays(int days, int& year, int& month, int& day)

{

    year += days / daysIn400Years * 400;

    days %= daysIn400Years;

    days += julianDay(year, month, day) - 1;

    while (1)

    {

        int dy = 365 + isLeap(year);

        if (days < dy) break;

        days -= dy;

        year++;

    }

    const int* julians = jDaysInMonths[isLeap(year)];

    for (month = 1; julians[month] <= days; ++month);

    days -= julians[month - 1];

    day = days + 1;

}

//----------------------------------------------------------------------------


void getDateComponents(double dateTime, int& year, int& month, int& day)

{

    int days = int(dateTime);

    getDateAfterDays(days, year = 1899, month = 12, day = 30);

}

// ---------------------------------------------------------------------------


설마 주석따윌 바란건 아니겠지?


여기서

1901년 1월 1일 부터 2100년 2월 28일까지만 맞아도 된다면 연산량을 꽤 줄일 수 있다.

#define isLeap(y) ((y) % 4 == 0)

이렇게 고치고

int days = int(dateTime) - 367;

getDateAfterDays(days, year = 1901, month = 1, day = 1);

요렇게 고치면 됨 (임베디드용으로 괜찮을듯)


물론 99일 뒤 (100일 째) 를 계산하기 위해선 getDateComponents 함수가 필요없다.

그 위에 있는 getDateAfterDays 만 쓰면 됨.