본문으로 건너뛰기 C++ duration | 'Time Interval' Guide

C++ duration | 'Time Interval' Guide

C++ duration | 'Time Interval' Guide

이 글의 핵심

C++ duration C++, duration, "time, 1.

Introduction

std::chrono::duration is a type representing time intervals. It’s type-safe, has clear unit conversion, and supports time operations.


1. duration Basics

Basic Usage

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;
    
    // Create time interval: duration type
    // std::chrono::seconds: seconds unit duration
    seconds sec(10);  // 10 seconds
    // std::chrono::milliseconds: milliseconds unit duration
    milliseconds ms(10000);  // 10000 milliseconds = 10 seconds
    // std::chrono::minutes: minutes unit duration
    minutes min(1);  // 1 minute = 60 seconds
    // std::chrono::hours: hours unit duration
    hours hr(1);  // 1 hour = 60 minutes = 3600 seconds
    
    // Get value: extract numeric value with count() method
    std::cout << "Seconds: " << sec.count() << std::endl;  // 10
    std::cout << "Milliseconds: " << ms.count() << std::endl;  // 10000
    
    return 0;
}

Standard duration Types

#include <chrono>

// C++11 standard units
std::chrono::hours h(1);
std::chrono::minutes m(60);
std::chrono::seconds s(3600);
std::chrono::milliseconds ms(3600000);
std::chrono::microseconds us(3600000000);
std::chrono::nanoseconds ns(3600000000000);

// All represent 1 hour

2. Time Conversion

Implicit Conversion (Higher → Lower)

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;
    
    seconds s(10);  // 10 seconds
    
    // ✅ Higher → Lower (implicit conversion possible)
    // Large unit → Small unit: no information loss
    // seconds → milliseconds: 10 seconds = 10000 milliseconds
    milliseconds ms = s;  // 10000ms (auto conversion)
    // seconds → microseconds: 10 seconds = 10000000 microseconds
    microseconds us = s;  // 10000000us (auto conversion)
    
    std::cout << "Milliseconds: " << ms.count() << std::endl;  // 10000
    std::cout << "Microseconds: " << us.count() << std::endl;  // 10000000
    
    return 0;
}

Explicit Conversion (Lower → Higher)

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;
    
    milliseconds ms(1500);  // 1500 milliseconds = 1.5 seconds
    
    // ❌ Lower → Higher (implicit not allowed)
    // Small unit → Large unit: possible information loss (truncate decimals)
    // seconds s = ms;  // Compile error: explicit conversion needed
    
    // ✅ duration_cast (explicit conversion)
    // duration_cast<seconds>: convert milliseconds to seconds
    // 1500ms → 1s (500ms truncated)
    seconds s = duration_cast<seconds>(ms);  // 1s (truncated)
    
    std::cout << "Seconds: " << s.count() << std::endl;  // 1
    
    return 0;
}

C++17 Rounding Functions

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;
    
    milliseconds ms(1500);  // 1500 milliseconds = 1.5 seconds
    
    // duration_cast: truncate (discard decimals)
    // 1.5 seconds → 1 second (0.5 seconds discarded)
    auto s1 = duration_cast<seconds>(ms);
    std::cout << "Truncate: " << s1.count() << "s" << std::endl;  // 1s
    
    // round: round (C++17)
    // 1.5 seconds → 2 seconds (round up since >= 0.5)
    auto s2 = round<seconds>(ms);
    std::cout << "Round: " << s2.count() << "s" << std::endl;  // 2s
    
    // ceil: ceiling (C++17)
    // 1.5 seconds → 2 seconds (always round up)
    auto s3 = ceil<seconds>(ms);
    std::cout << "Ceil: " << s3.count() << "s" << std::endl;  // 2s
    
    // floor: floor (C++17)
    // 1.5 seconds → 1 second (always round down, same as duration_cast)
    auto s4 = floor<seconds>(ms);
    std::cout << "Floor: " << s4.count() << "s" << std::endl;  // 1s
    
    return 0;
}

3. Time Operations

Arithmetic Operations

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;
    
    seconds s1(10);
    seconds s2(5);
    
    // Addition
    auto sum = s1 + s2;
    std::cout << "Sum: " << sum.count() << "s" << std::endl;  // 15s
    
    // Subtraction
    auto diff = s1 - s2;
    std::cout << "Diff: " << diff.count() << "s" << std::endl;  // 5s
    
    // Multiplication
    auto mul = s1 * 2;
    std::cout << "Multiply: " << mul.count() << "s" << std::endl;  // 20s
    
    // Division
    auto div = s1 / 2;
    std::cout << "Divide: " << div.count() << "s" << std::endl;  // 5s
    
    // Modulo
    auto mod = s1 % s2;
    std::cout << "Modulo: " << mod.count() << "s" << std::endl;  // 0s
    
    return 0;
}

Summary

Key Points

  1. duration: Represents time intervals
  2. Standard types: hours, minutes, seconds, milliseconds, etc.
  3. Conversion: Implicit (higher→lower), explicit (lower→higher)
  4. Operations: Arithmetic and comparison supported
  5. Literals: C++14 supports 10s, 500ms syntax

When to Use

Use duration when:

  • Need type-safe time intervals
  • Want clear unit conversion
  • Measuring elapsed time
  • Implementing timeouts

Don’t use when:

  • Simple integer milliseconds sufficient
  • Need calendar dates (use time_point)

Best Practices

  • ✅ Use appropriate unit for context
  • ✅ Use literals for readability (C++14+)
  • ✅ Use duration_cast for explicit conversion
  • ❌ Don’t mix units without conversion
  • ❌ Don’t use raw integers for time

Master duration for type-safe time handling! 🚀


자주 묻는 질문 (FAQ)

Q. 이 내용을 실무에서 언제 쓰나요?

A. Everything about C++ duration : from basic concepts to practical applications.

Q. 선행으로 읽으면 좋은 글은?

A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. C++ 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.

Q. 더 깊이 공부하려면?

A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.


같이 보면 좋은 글 (내부 링크)

이 주제와 연결되는 다른 글입니다.


이 글에서 다루는 키워드 (관련 검색어)

C++, duration, chrono, time, C++11 등으로 검색하시면 이 글이 도움이 됩니다.