提问人:afp_2008 提问时间:11/8/2023 最后编辑:afp_2008 更新时间:11/8/2023 访问量:97
如何以毫秒为单位从time_point中提取小时、分钟和秒?
How can hours, minutes, and seconds be extracted from a time_point in milliseconds?
问:
如何从给定的参数中提取小时、分钟和秒?std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>
我下面的代码没有正确返回小时。它返回小时的可变大值(例如,小时:472057,分钟:3)。
std::chrono::system_clock::time_point tp = std::chrono::system_clock::now();
auto hours = std::chrono::duration_cast<std::chrono::hours>(tp.time_since_epoch()).count();
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(tp.time_since_epoch()).count() % 60;
// Print the hours and minutes
std::cout << "Hours: " << hours << std::endl;
std::cout << "Minutes: " << minutes << std::endl;
答:
3赞
Howard Hinnant
11/8/2023
#1
由于您已经指定了 C++11,并删除了有关使用 Howard Hinnant 的日期库的部分,因此您必须重新创建日期库中仅作为第三方库存在的部分,直到 C++20。如果您对UTC感到满意,这并不是太麻烦。获取当地时间需要付出更多努力:
#include <chrono>
#include <iostream>
int
main()
{
// This is a date_time in UTC
std::chrono::system_clock::time_point tp = std::chrono::system_clock::now();
// This is a date in UTC
auto tp_days = std::chrono::time_point_cast<std::chrono::duration<int, std::ratio<86400>>>(tp);
// This is a time in UTC
auto tod = tp - tp_days;
// This is how to separate a duration into {h, m, s}
auto h = std::chrono::duration_cast<std::chrono::hours>(tod);
tod -= h;
auto m = std::chrono::duration_cast<std::chrono::minutes>(tod);
tod -= m;
auto s = std::chrono::duration_cast<std::chrono::seconds>(tod);
std::cout << "Hours: " << h.count() << '\n';
std::cout << "Minutes: " << m.count() << '\n';
std::cout << "Seconds: " << s.count() << '\n';
}
请注意,这仅适用于 1970-01-01T00:00:00 UTC 之后的 s。这是因为截断为零。C++17 引入了向负无穷大截断的函数,应该首选它,因为它在纪元之前和之后都有效。system_clock
time_point
time_point_cast
floor
若要获取本地时间,需要计算出当前的 UTC 偏移量,并将其添加到日期和时间之前(在截断为天精度之前)。time_point
评论