如何以毫秒为单位从time_point中提取小时、分钟和秒?

How can hours, minutes, and seconds be extracted from a time_point in milliseconds?

提问人:afp_2008 提问时间:11/8/2023 最后编辑:afp_2008 更新时间:11/8/2023 访问量:97

问:

如何从给定的参数中提取小时、分钟和秒?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;
C 日期 ++11 C ++-Chrono

评论

2赞 Howard Hinnant 11/8/2023
您跳过了减去“天数”部分的部分。此操作将日期/时间分隔为日期和时间。然后,您可以按照所示的时间工作。

答:

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_clocktime_pointtime_point_castfloor

若要获取本地时间,需要计算出当前的 UTC 偏移量,并将其添加到日期和时间之前(在截断为天精度之前)。time_point