时间点
表示时间上的瞬间
时间点 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
什么是时间点
std::chrono::time_point表示从时钟纪元开始计算的特定时刻。它将时钟与自该纪元以来经过的时长关联起来。
- 由
clock::now()返回。 - 将两个时间点相减会得到一个时长。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
time_point<steady_clock> tp = steady_clock::now();
std::cout << "Captured a moment: " << (tp.time_since_epoch().count() != 0) << '\n';
return 0;
}time_since_epoch
每个时间点都可以通过time_since_epoch()报告其与时钟纪元之间的距离,该函数返回一个时长。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto d = tp.time_since_epoch();
auto s = duration_cast<seconds>(d);
std::cout << "Positive epoch seconds: " << (s.count() > 0) << '\n';
return 0;
}时间点相减
用一个时间点减去另一个时间点,会得到一个时长,表示两个时刻之间经过的时间。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto a = steady_clock::now();
auto b = steady_clock::now();
auto diff = b - a;
std::cout << "Elapsed ns is non-negative: " << (diff.count() >= 0) << '\n';
return 0;
}添加时长
将时长添加到时间点会生成未来的新时间点(相减则会得到过去的时间点)。这就是计算截止时间的方式。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
auto now = steady_clock::now();
auto deadline = now + 10s;
std::cout << "Deadline is after now: " << std::boolalpha << (deadline > now) << '\n';
return 0;
}比较时间点
同一时钟的时间点支持所有比较运算符,因此您可以检查一个时刻是在另一个时刻之前还是之后。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto first = steady_clock::now();
auto second = steady_clock::now();
std::cout << std::boolalpha << (first <= second) << '\n';
return 0;
}特定时钟的时间点
时间点与其时钟的类型绑定。由于纪元不同,您不能直接比较system_clock时间点和steady_clock时间点。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
system_clock::time_point sys = system_clock::now();
steady_clock::time_point mono = steady_clock::now();
std::cout << "Both captured: " << ((sys.time_since_epoch().count() != 0) && (mono.time_since_epoch().count() != 0)) << '\n';
return 0;
}转换为 time_t
system_clock::to_time_t将日历时间点转换为 C 风格的time_t,以便格式化后供人阅读。
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
std::time_t t = system_clock::to_time_t(tp);
std::cout << "time_t is positive: " << (t > 0) << '\n';
return 0;
}from_time_t
相反,system_clock::from_time_t会根据time_t值构建时间点,例如根据存储的时间戳构建。
#include <iostream>
#include <chrono>
#include <ctime>
int main() {
using namespace std::chrono;
std::time_t t = 1000000000;
auto tp = system_clock::from_time_t(t);
auto back = system_clock::to_time_t(tp);
std::cout << "Round trip ok: " << std::boolalpha << (back == t) << '\n';
return 0;
}计算截止时间
一种常见模式是:捕获now(),添加超时时长,然后稍后与新捕获的now()进行比较,以判断是否已超过截止时间。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
using namespace std::chrono_literals;
auto deadline = steady_clock::now() + 0ms;
auto current = steady_clock::now();
bool expired = current >= deadline;
std::cout << "Expired: " << std::boolalpha << expired << '\n';
return 0;
}时间点精度
时间点的精度与其时钟的时长类型相匹配。您可以使用time_point_cast将时间点转换为更粗略的单位。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto secs_tp = time_point_cast<seconds>(tp);
std::cout << "Cast preserved sign: " << (secs_tp.time_since_epoch().count() > 0) << '\n';
return 0;
}存储时间戳
要持久化某个时刻,请将其转换为自纪元以来的秒数,存储该整数,并在需要时稍后重建时间点。
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
long long stored = duration_cast<seconds>(tp.time_since_epoch()).count();
std::cout << "Stored value usable: " << (stored > 0) << '\n';
return 0;
}快速检查
测试您对时间点运算的理解。
回顾
您了解了time_point:
- 它表示相对于时钟纪元的特定时刻
- 它通过
time_since_epoch()报告自身的偏移量 - 它支持添加、减去时长以及进行比较
- 它可以转换为
time_t或从time_t转换,以便显示和存储
接下来,您将使用这些工具对代码进行基准测试并测量其性能。
常见问题解答
「时间点」课时是免费的吗?
是的 — 「时间点」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「时间点」这节课中我会学到什么?
表示时间上的瞬间 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「时间点」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。