YOGYUI

C++::chrono - 현재 날짜/시간 가져오기 (밀리초 포함) 본문

Software/C, C++

C++::chrono - 현재 날짜/시간 가져오기 (밀리초 포함)

요겨 2022. 7. 24. 18:20
반응형

C++: chrono - Get Current Date/Time including millisecond (g++, POSIX)

 

윈도우즈 OS 타겟으로 개발한 C++ 기반 어플리케이션을 리눅스 OS에서 구동되게 포팅하는 작업을 진행하고 있다 (왠만한 유틸리티 함수들을 죄다 MFC를 활용해서 개발하다보니 손봐야할 게 한두개가 아니다 ㅠ)

 

이왕 포팅하는거 gcc/g++ 컴파일러로 구동할 수 있게 만들어보자 (POSIX 대응)

C++11 이상을 사용하고 있다면 <chrono> 모듈을 가져와서 간단하게 구현할 수 있다

 

#include <chrono>
#include <string>

static std::string get_time_stamp() {
    const auto now = std::chrono::system_clock::now();
    time_t tm_now = std::chrono::system_clock::to_time_t(now);
    struct tm tstruct = *localtime(&tm_now);

    auto duration = now.time_since_epoch();
    auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration) % 1000;
    
    char temp[128];
    snprintf(temp, sizeof(temp), "%04d%02d%02d-%02d:%02d:%02d.%03ld",
        tstruct.tm_year + 1900, tstruct.tm_mon + 1, tstruct.tm_mday, 
        tstruct.tm_hour, tstruct.tm_min, tstruct.tm_sec, millis.count());

    return std::string(temp);
}

현재 시각을 YYYYmmdd-HH:MM:SS.xxx 로 밀리세컨드 단위 타임스탬프 문자열을 만들어서 리턴하는 함수

std::chrono::system_clock::now > 현재 시간을 time_point 클래스 객체로 반환

std::chrono::system_clock::to_time_t > time_point 객체를 time_t 자료형으로 변환

time_t 자료형: 유닉스/POSIX/윈도우즈 모두 1970년 1월 1일 자정 이후부터 현재까지 흐른 초 (seconds)

localtime > time_t 값을 tm 구조체로 변환 (chrono 헤더를 가져오면 time.h 헤더 include 없이 사용 가능)

tm 구조체 내부 변수들을 통해 time_t 값을 년-월-일-시-분-초로 환산할 수 있다
struct tm {
    int tm_sec;   // 초, 범위 = 0 ~ 61
    int tm_min;   // 분, 범위 = 0 ~ 59
    int tm_hour;  // 시, 범위 = 0 ~ 23
    int tm_mday;  // 일, 범위 = 1 ~ 31
    int tm_mon;   // 월, 범위 = 0 ~ 11
    int tm_year;  // 년, 1900년 이후
    int tm_wday;  // 요일, 범위 = 0 ~ 6
    int tm_yday;  // 1월 1일 이후 지난 일 수, 범위 = 0 ~ 365
    int tm_isdst; // 서머타임 여부
};

또한 밀리초 단위값을 얻기 위해 time_point 클래스의 time_since_epoch 메서드를 활용

1970년 1월 1일 자정 이후로 흐른 시간을 duration 객체로 반환

duration 객체는 std::chrono::duration_cast<std::chrono::milliseconds>로 밀리초로 변환 (ToDuration 객체)

밀리초만 필요하기 때문에 1000으로 나눈 나머지 값만 사용하면 된다

(값을 가져올 때 count() 메서드를 호출하면 된다)

 

g++로 빌드한 후 OS별로 실행해보자 (평소에 사용하는 OS만 ㅎㅎ..)

#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << "current time: " << get_time_stamp() << "\n";

    std::cout << "press any key to exit" << "\n";
    std::cin.get();

    return 0;
}
$ g++ -g main.cpp -o main # windows는 main.exe로 output

windows
ubuntu
macOS

끝~!

[Git repo]

https://github.com/YOGYUI/Sniffets/tree/main/posix_get_current_time

 

GitHub - YOGYUI/Sniffets: 간단한 예제 코드들

간단한 예제 코드들. Contribute to YOGYUI/Sniffets development by creating an account on GitHub.

github.com

 

[참고]

https://gist.github.com/bschlinker/844a88c09dcf7a61f6a8df1e52af7730

https://docs.microsoft.com/ko-kr/cpp/standard-library/chrono?view=msvc-170 

https://araikuma.tistory.com/597

반응형