IT/C++

[C++] 현재 날짜와 현재 시각 출력하기

Wookii 2020. 1. 30. 15:41
728x90

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)

728x90