일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 해외주식
- homebridge
- Espressif
- Bestin
- 월패드
- matter
- SK텔레콤
- ConnectedHomeIP
- 애플
- 홈네트워크
- 매터
- 국내주식
- 배당
- 나스닥
- 코스피
- 현대통신
- 미국주식
- MQTT
- RS-485
- Home Assistant
- 파이썬
- 티스토리챌린지
- raspberry pi
- 오블완
- 공모주
- esp32
- Python
- 힐스테이트 광교산
- Apple
- cluster
- Today
- Total
YOGYUI
C++::chrono - 현재 날짜/시간 가져오기 (밀리초 포함) 본문
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
끝~!
[Git repo]
https://github.com/YOGYUI/Sniffets/tree/main/posix_get_current_time
[참고]
https://gist.github.com/bschlinker/844a88c09dcf7a61f6a8df1e52af7730
https://docs.microsoft.com/ko-kr/cpp/standard-library/chrono?view=msvc-170
'Software > C, C++' 카테고리의 다른 글
C++::Linux에서 네트워크 어댑터 MAC Address 가져오기 (0) | 2022.07.27 |
---|---|
C++::디렉터리 존재 여부 확인하기 (g++) (0) | 2022.07.25 |
MFC::프로그램으로 PC 전원 끄기 (Windows OS) (0) | 2022.02.23 |
C/C++::CRC8, CRC16, CRC32 계산 라이브러리 깃허브 등록 (DLL) (0) | 2021.10.22 |
C++::CRC-16 계산 알고리즘 구현 (소스코드) (2) | 2021.10.13 |