임베디드를 좋아하는 조금 특이한 개발자?

[C++20 : Chrono.h] system_clock를 사용한 현재 시간 구하기 본문

C++

[C++20 : Chrono.h] system_clock를 사용한 현재 시간 구하기

Gordon_ 2026. 3. 22. 20:54

- 참고 문서

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;
}

Window에서의 결과 : 100ns

 

mac에서 결과 : 1us

 

위에서 볼 수 있듯이 time_point의 최소 단위 시간은 운영체제에 따라 달라질 수 있습니다.