0Pricing
C++ Academy · 课时

时间点

表示时间上的瞬间

时间点 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 时长与时钟
  2. 时间点
  3. 测量代码性能
  4. 日历与时区
← 返回 C++ Academy