| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- atmel
- esp32
- yocto
- c#
- QEMU
- AVR
- C++
- Visual Studio Code
- Debug
- raspberrypi
- STM32
- 회로
- 라즈베리파이
- avr-gcc
- Visual Studio
- bare metal
- buildroot
- cpp
- UART
- Arduino
- AArch64
- Raspberry
- vscode
- GPIO
- Linux
- 아두이노
- Debugging
- 디버깅
- nucleo
- WPF
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[C++20 : Chrono.h] system_clock를 사용한 현재 시간 구하기 본문
- 참고 문서
https://en.cppreference.com/w/cpp/chrono/system_clock.html
std::chrono::system_clock - cppreference.com
class system_clock; (since C++11) Class std::chrono::system_clock represents the system-wide real time wall clock. It may not be monotonic: on most systems, the system time can be adjusted at any moment. It is the only C++ clock that has the ability to map
en.cppreference.com
- 주의 -
해당 포스트는 C++20 이상에서 동작합니다.
1. 서론
C++17까지는 C 라이브러리(time.h)에 대한 의존도가 높았습니다. 하지만 C++20으로 업데이트되면서 C 라이브러리에 대한 의존도를 줄이고 C++20에서 강력한 format 함수를 통해 훨씬 편하게 사용할 수 있도록 변경되었습니다. 이번 포스트에서는 이러한 변경점을 살펴보고 직접 사용하는 방법을 소개합니다.
2. system_clock 소개
system_clock는 OS로부터 현재 시간을 얻는 클래스입니다. 그리고 해당 시간은 epoch(1970년 1월 1일 0시 0분 0초 UTC)로부터 얼마나 시간이 났는지를 나타냅니다. 그렇기 때문에 system_clock는 사용자가 OS의 시간을 바꾼다면 시간이 미래나 과거로도 이동 가능합니다.
그리고 system_clock으로 나오는 시간은 UTC+0에 해당하는 시간이므로 각 time zone으로 시간을 변경해야 하는 과정이 필요합니다. (한국 표준시 KST는 UTC+9) system_clock이 UTC+0 기준으로 시간을 가져오는 이유는 각 지역에 있든 상관없이 컴퓨터끼리 같은 시간을 사용하기 위함입니다.
2.1. 현재 UTC 시간 출력
#include <iostream>
#include <chrono>
#include <format>
using namespace std;
int main(void) {
using namespace std::chrono;
system_clock::time_point now_utc = system_clock::now();
cout << "- UTC 기준 현재 시간" << endl;
std::cout << format("{:%Y-%m-%d %H:%M:%S}", now_utc) << std::endl;
// zoned_time은 개발 환경에 따라 없을 수도 있습니다(Mac 사용 불가)
// Visual studio 2026 에서는 사용가능합니다.
zoned_time zt(current_zone(), now_utc);
cout << endl;
cout << "- KST(UTC+9) 기준 현재 시간" << endl;
cout << zt << endl;
return 0;
}

- 주의 사항
개발 환경에 따라 zoned_time 이 없을 수 있습니다.
zoned_time을 사용할 수 없다면 아래 라이브러리를 사용하여 해결 가능합니다.
https://github.com/HowardHinnant/date
GitHub - HowardHinnant/date: A date and time library based on the C++11/14/17 <chrono> header
A date and time library based on the C++11/14/17 <chrono> header - HowardHinnant/date
github.com
format 함수로 현재 시간에 대해서 좀 더 다양하게 출력하고 싶다면 아래의 문서를 참조하세요.
https://en.cppreference.com/w/cpp/chrono/system_clock/formatter
std::formatter<std::chrono::sys_time> - cppreference.com
(since C++20) Specialization of std::formatter that defines formatting rules for a std::chrono::sys_time. If %Z is used, it is replaced with "UTC" widened to CharT. If %z or a modified variant thereof is used, an offset of 0min will be formatted. The std::
en.cppreference.com
2.2. epoch 시간 확인
#include <iostream>
#include <chrono>
#include <format>
using namespace std;
int main()
{
using namespace std::chrono;
time_point<utc_clock> epoch;
cout << format("Epoch time : {0:%F}T{0:%R%z}.", epoch) << '\n';
}

2.3. time_point의 최소 단위 시간 확인
#include <iostream>
#include <chrono>
#include <format>
#include <iomanip>
using namespace std;
int main()
{
using namespace std::chrono;
intmax_t num = system_clock::period::num;
intmax_t den = system_clock::period::den;
cout << fixed << setprecision(9) << (static_cast<double>(num) / static_cast<double>(den)) << "s" << endl;
}


위에서 볼 수 있듯이 time_point의 최소 단위 시간은 운영체제에 따라 달라질 수 있습니다.
'C++' 카테고리의 다른 글
| [C++] std::bind 함수를 원하는 호출 형태로 가공 (0) | 2026.03.24 |
|---|---|
| [C++] 사용자 정의 리터럴 (operator "") (0) | 2026.03.22 |
| [Visual Studio Code] C++ 자동완성(Autocomplete) 기능 활성화 (0) | 2026.03.09 |
| accumulate() 함수의 overflow 문제 해결 방법 (0) | 2025.01.21 |
| rel_ops를 통한 클래스 비교연산자 자동 구현 (0) | 2022.08.28 |