|
이건 고전(ANSI)적인 방법입니다. 전 주로 이것만 애용해서.. 다른 방법이 있나 모르겟군요.
Syntax
struct tm {
int tm_sec; /* Seconds */
int tm_min; /* Minutes */
int tm_hour; /* Hour (0--23) */
int tm_mday; /* Day of month (1--31) */
int tm_mon; /* Month (0--11) */
int tm_year; /* Year (calendar year minus 1900) */
int tm_wday; /* Weekday (0--6; Sunday = 0) */
int tm_yday; /* Day of year (0--365) */ <== 원하시는 데이터.
int tm_isdst; /* 0 if daylight savings time is not in effect) */
};
Header File
time.h
문제는 만약 TDateTime형 데이터 쓴다면 그것을 유닉스타임스탬프로 바꿔서 다시 struct tm형으로 바꿔줘야 계산이 가능하다는게..
아래 제가 라이브러리로 만들어 두고 쓰는 함수들입니다. 여러가지 컨버터가 있느니 참고 하시길..
그리고 빌더의 TDateTime형을 아래 형태로 생성하면 값이 엉터리로 들어가는 문제가 있더군요. 6.0에서는 고쳐졌을런지.
__fastcall TDateTime(unsigned short year, unsigned short month, unsigned short day);
// time_t의 값을 TDate형으로 변환
TDateTime time_tToDate(time_t CvtTime)
{
struct tm *tmt = localtime(&CvtTime);
if(CvtTime <= 0) return TDateTime();
TDate dDate = StrToDate(IntToStr(tmt->tm_year + 1900)+"-"+IntToStr(tmt->tm_mon+1)+"-"+IntToStr(tmt->tm_mday));
return dDate;
}
// time_t의 값으로 TTime형으로 변환.
TDateTime time_tToTime(time_t CvtTime)
{
struct tm *tmt = localtime(&CvtTime);
if(CvtTime <= 0) return TDateTime();
return TDateTime(tmt->tm_hour,tmt->tm_min,tmt->tm_sec,0);
}
// time_t의 값으로 TDateTime형으로 변환.
TDateTime time_tToDateTime(time_t CvtTime)
{
return time_tToDate(CvtTime)+time_tToTime(CvtTime);
}
// TDate + TTime 의 앖으로 time_t형으로 변환.
time_t DateTimeTotime_t(TDateTime nDate,TDateTime nTime )
{
return DateTotime_t(nDate)+TimeTotime_t(nTime);
}
// TDateTime형을 time_t형으로 변환
time_t DateTotime_t(TDateTime nDate )
{
Word nYear,nMon,nDay,nHour = 0,nMin = 0,nSec = 0,nmSec = 0;
struct tm tmt;
DecodeDate(nDate,nYear,nMon,nDay);
DecodeTime(nDate,nHour,nMin,nSec,nmSec);
tmt.tm_year = nYear - 1900;
tmt.tm_mon = nMon - 1;
tmt.tm_mday = nDay;
tmt.tm_hour = nHour;
tmt.tm_min = nMin;
tmt.tm_sec = nSec;
tmt.tm_wday = nDate.DayOfWeek() - 1;
tmt.tm_isdst = 0;
return mktime(&tmt);
}
// TDateTime형을 time_t형으로 변환
// 인수 bool bDayEnd 는 그날의 종료시점(23시 59분 59초)인지 시작시점(0시 0분 0초)인지 구분한다.
time_t DateTotime_t(TDateTime nDate,bool nDayEnd )
{
Word nYear,nMon,nDay,nHour = 0,nMin = 0,nSec = 0;
struct tm tmt;
// 하루의 끝시간으로 계산한다.
if(nDayEnd)
{
nHour = 23;
nMin = 59;
nSec = 59;
}
DecodeDate(nDate,nYear,nMon,nDay);
tmt.tm_year = nYear - 1900;
tmt.tm_mon = nMon - 1;
tmt.tm_mday = nDay;
tmt.tm_hour = nHour;
tmt.tm_min = nMin;
tmt.tm_sec = nSec;
tmt.tm_wday = nDate.DayOfWeek() - 1;
tmt.tm_isdst = 0;
return mktime(&tmt);
}
// TDateTime형의 값을 time_t형으로 변환한다(초단위 시간까지)
time_t TimeTotime_t(TDateTime nTime )
{
Word nYear,nMon,nDay,nHour,nMin,nSec,nmSec;
struct tm tmt;
DecodeDate(nTime,nYear,nMon,nDay);
DecodeTime(nTime,nHour,nMin,nSec,nmSec);
tmt.tm_year = nYear;
tmt.tm_mon = nMon - 1;
tmt.tm_mday = nDay;
tmt.tm_hour = nHour;
tmt.tm_min = nMin;
tmt.tm_sec = nSec;
tmt.tm_wday = nTime.DayOfWeek() - 1;
tmt.tm_isdst = 0;
return mktime(&tmt);
}
건전맨 님이 쓰신 글 :
: 날짜를 바꾸려고 하는데요....
: 음... 1월 1일은 001로 해서 12월 31일은 365가 되는거죠.
: 2월 5일은 036이 되겠죠.
: 함수가 있을 것 같은데..
: 아시는 분 계시면 알려주세요...
: 감사...
|