如何使用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 <= 11hconstexpr 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
相关产品推荐
相关产品推荐

