본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : std::chrono 날짜 및 시간대 (11, 14, 17, 20)

by snowoods 2025. 9. 6.

Modern C++

날짜 및 시간대 (Date and Timezone with std::chrono)

 

개요

C++20의 std::chrono 라이브러리는 강력한 날짜 및 시간대 처리를 위한 기능을 제공합니다. 이 문서에서는 날짜 리터럴, 캘린더 연산, 시간대 변환 등에 대해 설명합니다.

 

C++ 버전별 주요 키워드 도입 시기

  • C++11: 기본적인 std::chrono 기능 (시간 측정 중심)
  • C++14: 사용자 정의 리터럴 지원 (h, min, s, ms, us, ns)
  • C++17: 파일 시스템 시간 처리 개선
  • C++20: 캘린더 및 시간대 지원 (std::chrono::year, month, day, time_zone 등)

 

내용 설명

1. 날짜 표현

  • year, month, day 클래스를 사용하여 타입 안전한 날짜 표현
  • 날짜 리터럴: 2020y (연도), 15d (일), January (월)
  • 다양한 날짜 형식 지원 (연/월/일, 일/월/연, 월/일/연)

2. 시간대 지원

  • std::chrono::time_zone 클래스를 통한 시간대 관리
  • std::chrono::zoned_time을 사용한 시간대 인식 시간 표현
  • 시스템 시간대 자동 감지 및 지정된 시간대 설정 가능

 

예제 코드

#include <chrono>
#include <iostream>

using namespace std::chrono_literals;

int main()
{
    // 시간 간격 표현
    auto half_day = std::chrono::hours(12);
    auto minutes = std::chrono::minutes(60);
    auto seconds = std::chrono::seconds(30);
    auto milliseconds = std::chrono::milliseconds(500);
    auto microseconds = std::chrono::microseconds(500);
    auto nanoseconds = std::chrono::nanoseconds(500);

    // 다양한 날짜 형식 (C++20)
    // 형식: 연/월/일
    auto d1 = 2020y / 1 / 15;
    auto d2 = 2020y / std::chrono::January / 15;

    // 형식: 일/월/연
    auto d3 = 15d / 1 / 2020;
    auto d4 = 15d / std::chrono::January / 2020;

    // 형식: 월/일/연
    auto d5 = 1 / 15d / 2020;
    auto d6 = std::chrono::January / 15 / 2020;

    // 현재 시간대의 현재 시간 출력
    auto time = std::chrono::zoned_time{std::chrono::current_zone(),
                                      std::chrono::system_clock::now()};
    std::cout << "현재 시간: " << time << '\n';

    // 특정 시간대의 현재 시간 출력 (아시아/도쿄)
    auto time2 = std::chrono::zoned_time{std::chrono::locate_zone("Asia/Tokyo"),
                                       std::chrono::system_clock::now()};
    std::cout << "도쿄 시간: " << time2 << '\n';

    return 0;
}

 

실행 결과

실행 시점에 따라 다른 결과가 출력됩니다. 예시:

현재 시간: 2023-08-05 09:15:30 KST
도쿄 시간: 2023-08-05 09:15:30 JST

 

활용팁

  1. 날짜 연산
  2. using namespace std::chrono; auto today = year_month_day{floor<days>(system_clock::now())}; auto tomorrow = today + days{1}; auto next_month = year_month_day{today.year(), today.month() + months{1}, today.day()};
  3. 시간대 변환
  4. auto ny_time = zoned_time{"America/New_York", system_clock::now()}; auto london_time = zoned_time{"Europe/London", ny_time};
  5. 윤년 확인
  6. auto y = year{2024}; bool is_leap = y.is_leap(); // true
  7. 요일 구하기
  8. auto d = 2023y/August/4; auto wd = weekday{year_month_day{d}}; // Friday
  9. 마지막 날짜 구하기
  10. auto last_day = year_month_day_last{2023y, month_day_last{month{8}}}; // last_day.day()는 2023년 8월의 마지막 날을 가리킴

이 문서는 C++20의 std::chrono 라이브러리를 사용한 날짜 및 시간대 처리를 다루고 있습니다. 타입 안전한 날짜 연산과 시간대 변환을 통해 국제화된 애플리케이션 개발에 유용하게 사용할 수 있습니다.