//---------------------------------------------------------------------------------------
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 만 쓰면 됨.
씨프 허접이라 봐도모르겠따
주석을 //--------------------------------------------------- 하니까 보기 좋네여
색깔이 곱네