C++ 日期 & 时间详解
                           
天天向上
发布: 2025-03-29 15:09:37

原创
357 人浏览过

在 C++ 中,日期和时间处理主要依赖于 C 标准库 <ctime>C++11 引入的 <chrono>。这两者提供了不同的时间管理方式:

  • <ctime>:基于 C 语言,使用 time_ttm 结构体,提供基本的日期和时间操作。
  • <chrono>(C++11+):提供更强大的时间处理功能,包括高精度计时和时间单位转换。

1. C 语言风格的日期 & 时间(<ctime> 头文件)

1.1 time_t 获取当前时间

time_t 是一个整数类型,表示自 1970 年 1 月 1 日 00:00:00 UTC(Unix 时间)以来的秒数。

#include <iostream>
#include <ctime>

int main() {
    time_t now = time(0);  // 获取当前时间
    std::cout << "当前时间戳: " << now << std::endl;
    return 0;
}

1.2 tm 结构体解析时间

tm 结构体用于存储解析后的时间数据:

成员变量说明取值范围
tm_sec秒(0 – 59)0-59
tm_min分(0 – 59)0-59
tm_hour小时(0 – 23)0-23
tm_mday一个月中的日期(1 – 31)1-31
tm_mon月份(0 – 11,0 表示 1 月)0-11
tm_year自 1900 年以来的年数1900+
tm_wday一周中的天数(0 – 6,0 是周日)0-6
tm_yday一年中的天数(0 – 365)0-365

本地时间 localtime()

#include <iostream>
#include <ctime>

int main() {
    time_t now = time(0);
    tm* localTime = localtime(&now);

    std::cout << "本地时间: "
              << localTime->tm_year + 1900 << "-"
              << localTime->tm_mon + 1 << "-"
              << localTime->tm_mday << " "
              << localTime->tm_hour << ":"
              << localTime->tm_min << ":"
              << localTime->tm_sec << std::endl;

    return 0;
}

UTC 时间 gmtime()

tm* utcTime = gmtime(&now);

区别:

  • localtime() 返回本地时区的时间。
  • gmtime() 返回 UTC 时间(零时区时间)。

1.3 格式化时间 asctime()strftime()

(1)asctime()

#include <iostream>
#include <ctime>

int main() {
    time_t now = time(0);
    tm* localTime = localtime(&now);

    std::cout << "格式化时间: " << asctime(localTime);  // e.g., Sat Mar 30 14:23:45 2025
    return 0;
}

(2)strftime() 自定义格式

#include <iostream>
#include <ctime>

int main() {
    time_t now = time(0);
    tm* localTime = localtime(&now);

    char buffer[80];
    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localTime);
    std::cout << "自定义格式时间: " << buffer << std::endl;

    return 0;
}

常见格式符:

格式说明
%Y4 位年份,如 2025
%m月份(01-12)
%d日(01-31)
%H小时(00-23)
%M分钟(00-59)
%S秒(00-59)
%A完整星期名,如 “Sunday”
%B完整月份名,如 “March”

2. C++11 <chrono> 高精度时间

C++11 引入了 <chrono>,提供更精确的时间管理,包括:

  • std::chrono::system_clock(系统时钟)
  • std::chrono::steady_clock(单调时钟)
  • std::chrono::high_resolution_clock(高精度时钟)

2.1 获取当前时间点

#include <iostream>
#include <chrono>

int main() {
    auto now = std::chrono::system_clock::now();
    std::time_t now_c = std::chrono::system_clock::to_time_t(now);

    std::cout << "当前时间: " << std::ctime(&now_c);
    return 0;
}

2.2 计算时间间隔

(1)测量代码执行时间

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    auto start = std::chrono::high_resolution_clock::now();

    std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作

    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed = end - start;

    std::cout << "代码执行时间: " << elapsed.count() << " 秒" << std::endl;
    return 0;
}

(2)单位转换

#include <iostream>
#include <chrono>

int main() {
    using namespace std::chrono;

    milliseconds ms(5000);  // 5000 毫秒
    seconds sec = duration_cast<seconds>(ms);  // 转换为秒

    std::cout << "5000 毫秒 = " << sec.count() << " 秒" << std::endl;
    return 0;
}

3. 日期 & 时间的常见应用

3.1 生成时间戳

#include <iostream>
#include <chrono>

int main() {
    auto now = std::chrono::system_clock::now();
    auto duration = now.time_since_epoch();
    auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(duration);

    std::cout << "当前时间戳(毫秒): " << millis.count() << std::endl;
    return 0;
}

3.2 获取当前日期

#include <iostream>
#include <ctime>

int main() {
    time_t now = time(0);
    tm* localTime = localtime(&now);

    char buffer[20];
    strftime(buffer, 20, "%Y-%m-%d", localTime);
    std::cout << "今天日期: " << buffer << std::endl;

    return 0;
}

4. 总结

方式适用场景
<ctime>(C 方式)适合简单时间操作,如时间戳、本地时间
<chrono>(C++11+)适合高精度计时、时间间隔计算、单位转换

推荐:

  • 如果只是获取当前时间、时间戳,可以用 <ctime>
  • 如果需要高精度定时、时间计算,建议用 <chrono>

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *