질문과 답변

날짜 간격을 구해주는 함수가 있습니까? 날짜:2020-9-22 9:01:08 조회수:210
작성자 : Program
포인트 : 149
가입일 : 2020-02-13 11:49:35
방문횟수 : 48
글 16개, 댓글 12개
소개 : 재미있는 프로그램
작성글 보기
쪽지 보내기
예를들면 2019 09 09 에서 2020 10 01 까지
날짜수는 386일? 인데
이를 구해주는 함수 DayDiff ( 20190909, 20201001);
이런 윈도우용 함수가 있을 법도 한데
혹시 아시는 분 있으면 좀 부탁합니다.

두 날짜를 넣으면 사이의 경과날수를 리턴해 주는 함수

목록보기 삭제 수정 신고 스크랩

Program 9월24일 6:26:34  

이거참 내가 질문하고 내가 또 답을 하게되네
좀 복잡할 것 같았는데 막상 구현해 보니 생각보다는 쉽게 구현되더군요
y1 m1 d1 ~ y2,m2,d2 까지로 두고
if(y1 < y2)
{
if(m1 < m2)
{
}
else if(m1==m2)
{
}
else
{
}
else if(y1==y2)
...
...
이렇게 모두 경우 3x3x3=27 가지에서 하나하나 구현해 보니
대부분 같은 코드로 나와 경우의 수가 통합됩니다.
여기서 먼저 월별날짜배열 int arday[]={0,31,28,31,30 ....}을 만들어 놓고
이 배열을 참조하도록 하변 됩니다.

그럭저럭 잘 동작하는데
윤년 2월29일까지 았는 해
이것을 구현할려니 막히네요

작가K 9월29일 6:28:17  

윈도우용 함수가 따로 있지는 않습니다. 대신 절대 날짜와 상대 날짜를 통해 연산 가능합니다.

// st 날짜의 절대 날짜를 구한다. 1601년 1월 1일을 기준(0일)으로 경과한 날짜 수를 세 준다.
DWORD MyGetAbsDay(SYSTEMTIME st)
{
 INT64 i64;
 FILETIME fst;

 st.wHour=st.wMinute=st.wSecond=st.wMilliseconds=st.wDayOfWeek=0;
 SystemTimeToFileTime(&st,&fst);
 i64=(((INT64)fst.dwHighDateTime) << 32) + fst.dwLowDateTime;
 i64 = i64 / 864000000000;
 return (DWORD)i64;
}

// 절대 날짜를 시스템 타임으로 바꾼다.
void MyAbsToSystem(DWORD Abs, SYSTEMTIME &st)
{
 INT64 i64;
 FILETIME fst;

 i64=Abs * 864000000000;
 fst.dwHighDateTime = (DWORD)(i64 >> 32);
 fst.dwLowDateTime = (DWORD)(i64 & 0xffffffff);
 FileTimeToSystemTime(&fst, &st);
}

이 두 함수를 잘 사용하면 DiffDay 함수를 만들어 쓸 수 있지요. SYSTEMTIME 타입의 sStart와 sEnd가 있다면 경과일은 다음 공식으로 구합니다.

dStart=MyGetAbsDay(sStart);
dEnd=MyGetAbsDay(sEnd);
dEllipse=dEnd-dStart;

그냥 빼기만 하면 되지요. 초 단위까지 계산하는 함수도 물론 만들 수 있어요.
 

Program 9월30일 12:10:04  

오 !
위 코드로 만들어 실행하니 잘 됩니다. 윤년 1일 더 있는 것도 계산하고
사실 은행 적금 프로그램을 만들었거든요
한달 오십만원씩 1년 이율 2.8%로 넣고 돌리니
윤년 1일이 작동안할때 30원 정도 오차가 나더니
윤년을 포함하여 계산하니 은행만기환급금과 2원의 오차가 나오더군요
이것은 아마도 이율의 소수점아래까지 미세한 계산의 오차가 아닌가 생각듭니다

한편 위 함수에서 절대시간 시스템시간 간의 변환을 이용하니
매월 적금인출일이 19일 일때 1월19일 2월19일 ... 원금과 이자를 출력해 주고
3월19일이 일요일이면 3월20일(월)에 인출되도록 출력까지 하는 코드도 만들었습니다.
if(3월19일==sunday) start += 1;
MyAbsToSystem(start,st); 이런식으로 하루뒤 날짜를 구하여 출력하였습니다.
물론 여기서 3월19일이 무슨요일인지는 GetLocalTiem()으로 오늘요일을 구한 후
날짜간격을 또 계산하고 이를 7로 나누고 살짝 복잡합니다만 

위 코드 정말 감사드립니다.(언뜻 보니 아주 예전에 저자 API책에서 본 기억이 가물가물 하기도...)


로그인하셔야 댓글을 달 수 있습니다.