현재 시간을 기록해야하는 과제가 있었다. C++ 에서 시간 관련 함수를 찾아보니 time 함수가 있었다.
time_t time(time_t *pTime)
time 함수는 1970년 1월 1일 0시부터 현재까지 흐른 시간을 time_t 타입으로 반환을 한다.
아래 코드를 보면 변수를 선언하고, std::time(&time_ptr);
로 시간을 구한걸 확인할 수 있다. time_ptr
변수에 시간이 담겨있다.
void Account::_displayTimestamp(void) {
time_t time_ptr;
std::time(&time_ptr);
}
하지만 time
함수를 그대로 쓸 수 없다. 그래서 localtime
을 사용한다.
struct tm* localtime(const time_t* pTime)
매개 변수로 time_t
의 주소를 받으면, tm
구조체에 시간의 값을 넣어 반환해준다. tm
구조체는 연, 월, 일, 시, 초 등의 변수들을 갖고 있다.
사용은 다음과 같다. 위에서 time
함수를 이용해서 구한 time_t
타입의 time_ptr
을 localtime
에 매개 변수로 넣는다.
void Account::_displayTimestamp(void) {
time_t time_ptr;
struct tm *currentTime;
std::time(&time_ptr);
currentTime = localtime(&time_ptr);
}
tm 은 어떻게 되어있을까?
다음과 같이 되어있다. 값 별로 시작 값이 다르기 때문에 사용하려면 약간의 수정이 필요하다.
struct tm
{
int tm_sec; // seconds after the minute - [0, 60] including leap second
int tm_min; // minutes after the hour - [0, 59]
int tm_hour; // hours since midnight - [0, 23]
int tm_mday; // day of the month - [1, 31]
int tm_mon; // months since January - [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday - [0, 6]
int tm_yday; // days since January 1 - [0, 365]
int tm_isdst; // daylight savings time flag
};
실제 사용은 다음처럼 했다.
void Account::_displayTimestamp(void) {
time_t time_ptr;
struct tm *currentTime;
std::time(&time_ptr);
currentTime = localtime(&time_ptr);
std::cout << "[";
std::cout << currentTime->tm_year + 1900;
std::cout << std::setw(2) << std::setfill('0') << currentTime->tm_mon + 1;
std::cout << std::setw(2) << std::setfill('0') << currentTime->tm_mday << "_";
std::cout << std::setw(2) << std::setfill('0') << currentTime->tm_hour;
std::cout << std::setw(2) << std::setfill('0') << currentTime->tm_min;
std::cout << std::setw(2) << std::setfill('0') << currentTime->tm_sec;
std::cout << "] ";
}
다음과 같이 출력되며, 여러 줄이 나오는 이유는 여러 번 실행했기 때문이다.
위 함수를 보면 std::setw(2)
과 std::setfill('0')
가 있다.
std::setw
는 출력시 개수를 지정하고, std::setfill
은 빈 공간을 채우는 함수이다.
헤더파일은 <iomanip>
이 필요하며, 구문은 다음과 같다.
std::setw(n)
출력시 길이를 n으로 지정.
std::setfill(c)
비어있는 공간을 c로 채워주는 함수. 위 코드에서 setw
와 setfill
이 적용된 것과 안된 것의 차이를 보자.
이 프로그램을 실행했을 때
2022년 12월 08일 00시 09분 12초였다.
2022년 12월 08일 00시 19분 23초였다.
왼쪽은 적용된 것이기 때문에 월, 일, 시, 분, 초 모두 2자리를 보장한다. 하지만 오른쪽은 보장하지 않아서 일, 시에 있는 십의 자리 0
이 사라진 것을 볼 수 있다.
과제 중에 클래스를 이용해서 객체를 생성한 후, 데이터를 조작하고 객체를 소멸하는 log 를 똑같이 만들어야하는게 있다. 과제에서 제공하는 log 파일과 내가 만든 파일을 비교해본 결과 소멸자 호출 순서에 차이가 있었다. 옆에 있던 동료에게 물어보니 과제에서 제공한 파일은 리눅스이고 우리가 사용하는 컴퓨터는 MacOS 라서 차이가 생겼다고 한다.