Post List

2015년 3월 24일 화요일

[C/C++] time_t, tm 사용하기

C / C++ 에서 시간, 날짜 관련된 class 및 struct 들은 많다.
Modern C++에서는 std::chrono를 사용하면 직관적으로 편리하게 사용이 가능하지만,
최신 컴파일러가 아닌 환경에서 Windows , Linux에서 같이 사용되어야 할 코드에서는
time_ttm을 이용하는게 최선이 아닐까 한다.

1. time_t의 용도

 * 1970년 1월 1일 자정 이후 경과된 시간(초 단위)을 가지고 있다.
 * 현재 시간을 가져오기에 편리하다. (관련 함수 제공)
 * 시간간의 간격 계산이 편리하다.

#include <time.h>

time_t tNow = time(NULL);        // 현재 시간 가져오기

time_t mktime(&sTm_UD);

int nDiff = difftime(tUD, tNow); // 두 시간 간의 차이를 초(sec) 단위로 계산한다.

tNow += 150 * 60 * 60 * 24; // 150  날짜 : 150일 x 24시간 x 60분 x 60초

2. tm의 용도

 * 1900년 이후 시간의 표현이 가능하다.
 * 년, 월, 일, 시, 분, 초 의 사용자가 직접 입력이 가능하다.

// tm 특정 날짜로 만들기
tm sTm_UD;
memset(&sTm_UD, 0, sizeof(tm));
sTm_UD.tm_year = 200;
sTm_UD.tm_mon = 2;
sTm_UD.tm_mday = 5;

printf(asctime(&sTm_UD));
cout << 1900 + sTm_UD.tm_year << " - " << 1 + sTm_UD.tm_mon << " - " << sTm_UD.tm_mday << endl;


이렇게 두 타입간의 장점이 다르다.
이제 두 타입간의 변환만 할 수 있으면 충분히 어떤 용도로도 활용이 가능 할 것이다.

3. time_t <-> tm

time_t tNow = time(NULL);     // 현재 시간 가져오기

// time_t to tm
tm sTm_Now;
localtime64_s(&sTm_Now, &tNow); // time_t -> tm

time_t tUD = mktime(&sTm_Now);  // tm -> time_t

localtime64_s( ) 와  mktime( )를 이용하면 서로 형변환이 가능하다.