You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用std::chrono::time_point调用std::chrono::is_am?

判断std::chrono::time_point对应的上午/下午(C++20)

C++20在std::chrono命名空间新增了两个用于判断上午/下午的自由函数:

  • constexpr bool is_am(const hours& h) noexcept;

    返回值:0h <= h && h <= 11h

  • constexpr bool is_pm(const hours& h) noexcept;

    返回值:12h <= h && h <= 23h

如果只有std::chrono::time_point对象,核心思路是先提取该时间点对应时区的小时数(hours类型),再调用上述函数判断。

针对本地时间的判断

如果需要判断时间点在本地时区的上午/下午,先将time_point转换为本地时间,再提取小时部分:

#include <chrono>

// 判断本地时间是否为上午
bool is_local_am(const std::chrono::system_clock::time_point& tp)
{
    const auto local_time = std::chrono::current_zone()->to_local(tp);
    const auto hours_since_epoch = std::chrono::floor<std::chrono::hours>(local_time).time_since_epoch();
    return std::chrono::is_am(hours_since_epoch);
}

// 判断本地时间是否为下午
bool is_local_pm(const std::chrono::system_clock::time_point& tp)
{
    const auto local_time = std::chrono::current_zone()->to_local(tp);
    const auto hours_since_epoch = std::chrono::floor<std::chrono::hours>(local_time).time_since_epoch();
    return std::chrono::is_pm(hours_since_epoch);
}

针对UTC时间的判断

如果直接判断时间点在UTC时区的上午/下午,无需转换时区,直接提取小时部分即可:

#include <chrono>

// 判断UTC时间是否为上午
bool is_utc_am(const std::chrono::system_clock::time_point& tp)
{
    const auto hours_since_epoch = std::chrono::floor<std::chrono::hours>(tp).time_since_epoch();
    return std::chrono::is_am(hours_since_epoch);
}

// 判断UTC时间是否为下午
bool is_utc_pm(const std::chrono::system_clock::time_point& tp)
{
    const auto hours_since_epoch = std::chrono::floor<std::chrono::hours>(tp).time_since_epoch();
    return std::chrono::is_pm(hours_since_epoch);
}

关键说明

  • std::chrono::floor<hours>(t)用于将时间点向下取整到最近的小时,得到的是time_point类型,调用time_since_epoch()即可获取从纪元开始的小时数(hours类型)。
  • 若需要使用其他时区(而非本地或UTC),可替换current_zone()为std::chrono::locate_zone("时区ID")(例如"Asia/Shanghai")。

内容的提问来源于stack exchange,提问作者Howard Hinnant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:07:33