C++에서 오늘 날짜와 현재 시각을 출력하는 방법에 대해 정리해보겠습니다.
우선 C언어에서 사용하던 <time.h> 헤더 파일은 헤더 파일을 이용하면 똑같이 사용할 수 있습니다. 그러고 보니 <time.h> 헤더 파일을 그대로 사용하면 될 것 같은데, 굳이 헤더 파일을 새롭게 만든 이유가 궁금하네요.
아래 코드는 현재 날짜와 시각 정보를 출력하는 코드입니다.
#include <ctime>
#include <iostream>
int main()
{
struct tm curr_tm;
time_t curr_time = time(nullptr);
localtime_r(&curr_time, &curr_tm);
int curr_year = curr_tm.tm_year + 1900;
int curr_month = curr_tm.tm_mon + 1;
int curr_day = curr_tm.tm_mday;
int curr_hour = curr_tm.tm_hour;
int curr_minute = curr_tm.tm_min;
int curr_second = curr_tm.tm_sec;
printf("%d-%d-%d %d:%d:%d\n", curr_year, curr_month,
curr_day, curr_hour, curr_minute, curr_second);
return 0;
}
컴파일 후 실행하면 다음의 결과를 얻을 수 있습니다.
$ g++ -std=c++17 -o date date.cpp
$ ./date
2020-1-30 14:17:40
기본적으로 리눅스의 시스템은 1970년 1월 1일 0시 0분 0초 (UTC) 를 기준으로 현재까지 흐른 시간을 초 단위로 계산하여 시간을 보여줍니다. 그리고 시간을 계산한 값은 time_t 자료형으로 나타내고 있습니다.
또한 시간 구조체 struct_tm은 time_t 자료형을 우리가 쉽게 접할 수 있는 '연, 월, 일, 시, 분, 초'의 형태로 보관할 수 있는 구조체입니다. 다음과 같은 정보가 들어 있습니다.
struct tm
{
int tm_sec; // second (0 - 60)
int tm_min; // minute (0 - 59)
int tm_hour; // hour (0 - 23)
int tm_mday; // day (1 - 31)
int tm_mon; // month (0 - 11) *
int tm_year; // year - 1900 *
...
};
struct tm 을 이용할 때 주의해야 할 점은 연도와 월을 보관하는 값에 보정이 필요하다는 점입니다.
- 연도의 값을 갖고 있는 tm_year은 현재 연도에서 1900을 뺀 값입니다. 따라서 현재 연도의 값을 얻기 위해서는 1900을 다시 더해주는 작업이 필요합니다.
- 월의 값을 갖고 있는 tm_mon은 현재 월에서 1을 뺀 값입니다. 따라서 현재 월의 값을 얻기 위해서는 1을 더해주는 작업이 필요합니다.
time_t 자료형에 담긴 시간값을 struct_tm 구조체 형식으로 변환하려면 localtime() 함수를 사용하면 됩니다. localtime() 함수의 인자로는 timer 포인터를 넣어주어야 합니다. 보통 timer 값에는 null 포인터를 넘겨주는데요, 상기 코드에서도 nullptr 을 넘겨준 것을 확인할 수 있습니다.
그러나 localtime() 함수는 내부적으로 같은 struct tm 구조체를 공유하고 있기 때문에, 각 상황에 따라 다른 현재 시각 정보를 가져오려면 localtime() 함수를 사용하시면 안됩니다. (출처 : 강아지의 코딩공부)
위와 같은 문제를 해결하려면 localtime_r() 함수를 이용하시면 됩니다. localtime_r() 함수는 timer 포인터 뿐만 아니라, struct tm 구조체를 각각 넘겨주기 때문에, 서로 공유하지 않게 됩니다.
추가적으로, 32-bit의 time32_t 자료형을 이용하는 경우, 2038년 1월 18일 (UTC) 이후에 오류가 발생할 수 있다고 합니다. 따라서 가능하다면 3000년 12월 31일 23시 59분 59초 (UTC)까지 표현이 가능한 64-bit의 자료형을 이용하여 프로그램을 구현하는 것을 권장합니다. (출처 : docs.microsoft.com (localtime, _localtime32, _localtime64)
'IT > C++' 카테고리의 다른 글
[C++] C++에서 std::thread를 어떻게 종료시킬 수 있을까? (0) | 2020.01.18 |
---|---|
[C++] Thread 정리하기 (0) | 2020.01.15 |