2012-11-20 2 views
3

나는 입력/출력을 계산할 수있는 C++ 코드를 가지고 있습니다. (입력 된 날짜를 특정 증분으로 늘리거나 줄일 수 있음을 의미합니다. 그것에 대한 계산).C++ time_t back to before 1/1/1970

나는 내 코드에 time_t 변수를 사용합니다. msdn 문서 accroding time_t는 1970 년 1 월 1 일 이후에 elasps 된 초 수입니다. 그래서 주어진 입력 날짜에 나는 1970 년 1 월 1 일부터 elasp 된 초를 먼저 계산하고, time_t vcariable에 저장하고 나중에 다른 모든 계산에 localtime()을 사용합니다.

내 입력 날짜가 1970 년 1 월 1 일 이상이지만 그 전에 날짜별로 분류되기 때문에 내 코드가 올바르게 작동합니다.

질문 : 제가 1970 년 1 월 1 일 전에 갈 수있는 다른 변수 나 구조가 있습니까? 또는 1970 년 1 월 1 일 이전에 time_t 변수를 조작하는 방법이 있습니다.

미리 감사드립니다.

나는 02/01/1970로 시작합니다. 나는 제 그때

void localtime(int* py = 0, int* pm = 0, int* pd = 0, 
      int* ph = 0, int* pn = 0, int* ps = 0, 
      int* pwday = 0, int* pyday = 0, int* pisdst = 0) const 
{ 
    struct tm* ptm = ::localtime(&t_); 
    if (py) *py = ptm->tm_year + 1900; 
    if (pm) *pm = ptm->tm_mon + 1; 
    if (pd) *pd = ptm->tm_mday; 
    if (ph) *ph = ptm->tm_hour; 
    if (pn) *pn = ptm->tm_min; 
    if (ps) *ps = ptm->tm_sec; 
    if (pwday) *pwday = ptm->tm_wday; 
    if (pyday) *pyday = ptm->tm_yday; 
    if (pisdst) *pisdst = ptm->tm_isdst; 
} 

를 사용 제가 사용하여 2 개월을 줄이려 : maketime (Y, m + 카운트, D, H, N, S)을; Y = 1,970, m = 2, 개수 = -2, D = 1은 다음과 같이 (상기 코드의 출력으로부터 maketime()이다..

이 t_ = -1 결과
void maketime(int y, int m, int d, int h = 0, int n = 0, int s = 0) 
{ 
    struct tm t; 
    t.tm_year = y - 1900; 
    t.tm_mon = m - 1; 
    t.tm_mday = d; 
    t.tm_hour = h; 
    t.tm_min = n; 
    t.tm_sec = s; 
    t.tm_isdst = -1; 

    t_ = ::mktime(&t); 
} 

다시 난의 현지을 (호출이 결과 지금

) 및

 struct tm* ptm = ::localtime(&t_); 

의 현지 제 1 내측 라인()이 실패하면 t_ = -1.

+0

1 개월을 빼기하려고하면 예를 들어, 무슨 일이 일어날 지 확실하지 않다가 할 수있는 방법이 없습니다 설명서에서 당신에게 알려주기 때문에 01/01/1970 이전에 갈 time_t 변수를 조작하십시오. –

+0

'time_t'는 부호있는 값이므로 어떤 문제가 있는지 이해하지 못합니다. 더 자세하게 얘기해 주 시겠어요? –

+0

안녕하세요. Mark 사용중인 코드로 게시물을 업데이트했습니다. 내가 실패한 곳에서 설명했다. – user1612986

답변

3

FILETIME 마찬가지로 정수 개수에 기반 100- 이것에서 나노초 간격 예를 들어 1601로 돌아갑니다.

편집을보고 나면 문제는 간단 해 보입니다. tm struct의 모든 요소가 경계 내에 있는지 확인해야합니다. 개월을 더하거나 뺄 때 월 번호가 0에서 11 사이가 될 때까지 조정해야합니다. time_t 또는 FILETIME 중 어느 것을 사용하든 상관 없습니다.

while (m < 0) 
{ 
    m += 12; 
    y -= 1; 
} 
while (m > 11) 
{ 
    m -= 12; 
    y += 1; 
} 

나는 날이 한 달에 일 수를 초과하는 경우 월 31에서 당신은 알고

관련 문제