从获取当前时间开始
写程序时,经常要记录某个操作发生的时间,比如日志打点、性能测试。C++11 引入了标准时间库 <chrono>,配合 <ctime> 能轻松处理大多数时间相关需求。
最常用的是获取当前系统时间:
#include <iostream>\n#include <chrono>\n#include <ctime>\n\nint main() {\n auto now = std::chrono::system\_clock::now();\n std::time\_t time\_t\_now = std::chrono::system\_clock::to\_time\_t(now);\n std::cout << \"当前时间:\" << std::ctime(&time\_t\_now);\n return 0;\n}这段代码输出类似 Mon Apr 5 14:30:22 2025 这样的格式。如果你在做服务器日志,可以直接拿来用。
精确到毫秒或微秒
有时候秒级精度不够。比如你要测一段函数运行多久,得看毫秒甚至微秒。<chrono> 支持高精度时钟:
#include <iostream>\n#include <chrono>\n\nint main() {\n auto start = std::chrono::high\_resolution\_clock::now();\n\n // 模拟一些工作\n for (int i = 0; i < 100000; ++i) {\n volatile int j = i * i;\n }\n\n auto end = std::chrono::high\_resolution\_clock::now();\n auto duration = std::chrono::duration\_cast<std::chrono::microseconds>(end - start);\n std::cout << \"耗时:\" << duration.count() << \" 微秒\\n\";\n return 0;\n}这里用了 high_resolution_clock,适合测量短时间间隔。duration_cast 把时间差转成微秒数,方便查看。
时间单位转换很灵活
chrono 内建了多种时间单位:nanoseconds、microseconds、milliseconds、seconds、minutes、hours。它们之间可以自动换算:
std::chrono::seconds sec(30);\nstd::chrono::minutes min = std::chrono::duration\_cast<std::chrono::minutes>(sec);\nstd::cout << min.count() << \" 分钟\\n\"; // 输出 0,因为 30 秒不足 1 分钟\n\n// 正确做法:允许小数部分用浮点类型表示\nstd::chrono::duration<double, std::ratio<60>> fractional\_min = sec;\nstd::cout << fractional\_min.count() << \" 分钟\\n\"; // 输出 0.5如果只是整型转换,会截断。需要保留小数就得用浮点模板参数。
构造定时任务也不难
假如你写个监控程序,每 2 秒查一次状态,可以用 sleep_for:
#include <iostream>\n#include <chrono>\n#include <thread>\n\nvoid monitor() {\n while (true) {\n std::cout << \"检查系统状态...\\n\";\n std::this\_thread::sleep\_for(std::chrono::seconds(2));\n }\n}sleep_for 接受任意 chrono duration 类型,写起来比原始的 sleep 函数清晰多了,而且不会和平台有关。
自定义时间点格式输出
默认的 ctime 输出格式固定,想改成 YYYY-MM-DD HH:MM:SS?可以结合 tm 结构和 strftime:
auto now = std::chrono::system\_clock::now();\nstd::time\_t t = std::chrono::system\_clock::to\_time\_t(now);\nstd::tm* tm\_now = std::localtime(&t);\n\nchar buffer[30];\nstd::strftime(buffer, sizeof(buffer), \"%Y-%m-%d %H:%M:%S\", tm\_now);\nstd::cout << \"格式化时间:\" << buffer << '\\n';这样就能打出 2025-04-05 14:30:22 这类常见格式,适合写进日志文件。
","seo_title":"C++标准时间库用法详解 - 智睿享软件指南","seo_description":"掌握C++标准时间库chrono的常见用法,包括获取当前时间、高精度计时、时间单位转换与定时任务实现,适用于日志、性能测试等场景。","keywords":"C++标准时间库用法,C++ chrono用法,获取当前时间,C++计时,C++时间格式化"}