文章

时间处理chrono

时间处理chrono

[TOC]

chrono

C++ 标准库提供了 <chrono> 头文件,用于处理时间相关的操作。这个头文件引入了一组用于处理时间的类和函数,是 C++11 标准引入的一个重要组成部分。

<chrono> 头文件的核心是 std::chrono 命名空间,其中定义了各种类型和函数,用于表示时间点、时间间隔和时钟,以及执行时间相关的操作。以下是 <chrono> 中一些重要的类和类型:

  1. 时间点(Time Point):表示某个特定时刻的类,可以是绝对时间(例如 Unix 时间戳)或相对时间(例如从程序开始运行的时间)。常见的时间点类型包括 std::chrono::system_clock::time_pointstd::chrono::steady_clock::time_pointstd::chrono::high_resolution_clock::time_point
  2. 时间间隔(Duration):表示一段时间的类,可以是以秒、毫秒、微秒等单位的时间长度。常见的时间间隔类型包括 std::chrono::duration 和其特化版本,例如 std::chrono::secondsstd::chrono::millisecondsstd::chrono::microseconds 等。
  3. 时钟(Clock):定义了时间的基准,用于测量时间点和计算时间间隔。常见的时钟类型包括 std::chrono::system_clock(系统时钟,通常表示当前时间)、std::chrono::steady_clock(稳定时钟,适用于计时器和间隔计算)和 std::chrono::high_resolution_clock(高精度时钟,提供更高的精度和分辨率)。
  4. 时钟周期(Clock Period):时钟周期指定了时钟的最小计数单位,通常以纳秒、微秒或毫秒为单位。

<chrono> 提供了一组功能强大的工具,用于处理时间点之间的算术运算、时间间隔的计算、时间的格式化和解析等操作。它是 C++ 中处理时间的推荐方式,具有类型安全性、可移植性和灵活性等优点,可以方便地处理复杂的时间操作需求。

在C++中,与日期和时间相关的操作通常使用标准库 <chrono> 进行处理。以下是一个简单的示例,演示了如何使用 <chrono> 来获取当前日期和时间,并进行一些基本的操作:

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
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <chrono>
#include <ctime>

int main() {
    // 获取当前时间点
    auto now = std::chrono::system_clock::now();

    // 转换为时间戳(秒为单位)
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);

    // 输出当前时间
    std::cout << "Current time: " << std::ctime(&now_c);

    // 获取当前日期和时间的年、月、日、时、分、秒
    std::tm* ptm = std::localtime(&now_c);
    int year = ptm->tm_year + 1900; // 年份需要加上 1900
    int month = ptm->tm_mon + 1;     // 月份从 0 开始
    int day = ptm->tm_mday;
    int hour = ptm->tm_hour;
    int minute = ptm->tm_min;
    int second = ptm->tm_sec;

    // 输出年、月、日、时、分、秒
    std::cout << "Year: " << year << std::endl;
    std::cout << "Month: " << month << std::endl;
    std::cout << "Day: " << day << std::endl;
    std::cout << "Hour: " << hour << std::endl;
    std::cout << "Minute: " << minute << std::endl;
    std::cout << "Second: " << second << std::endl;

    // 构造日期对象
    std::chrono::year_month_day date = std::chrono::year_month_day{std::chrono::floor<std::chrono::days>(now)};

    // 输出年、月、日
    std::cout << "Year: " << date.year() << std::endl;
    std::cout << "Month: " << unsigned(date.month()) << std::endl;
    std::cout << "Day: " << date.day() << std::endl;

    return 0;
}

此示例中,首先使用 std::chrono::system_clock::now() 获取当前时间点,然后通过 std::chrono::system_clock::to_time_t() 将时间点转换为 std::time_t 类型,以便使用标准库函数 std::ctime() 输出时间字符串。

接着,使用 std::localtime()std::time_t 转换为 std::tm 结构体,以获取年、月、日、时、分、秒等时间信息。注意,月份和小时都需要进行适当的调整。

最后,使用 std::chrono::year_month_day 构造了一个日期对象,并输出了其年、月、日信息。

参考12

本文由作者按照 CC BY 4.0 进行授权