c++ 如何将date::year_month_day转换为chrono time_point

mlnl4t2r  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(94)

我试图将霍华德·欣南特先生的库中的date::year_month_day转换为std::chrono::system_clock::time_point,但没有成功。最终,我想从UTC时区的时间点计算time_since_epoch().count()
我下面的代码可以完成这项工作(结果是在我的本地时区),但如果它提供这样的功能,我更愿意使用date库。

date::year_month_day _ymd = date::year{2023}/11/9; // November 9, 2023

    // Modern C++
    // The following returns 16994880000000000
    // = Thursday, July 16, 1970 4:48:00 PM, which is not 2023/11/09
    std::chrono::system_clock::time_point tp = 
            std::chrono::time_point<std::chrono::system_clock, std::chrono::days>(std::chrono::sys_days{_ymd});

    // Classic C++
    // The following returns 1702108800
    // = Saturday, December 9, 2023 8:00:00 AM, which of course is not 2023/11/09
    struct tm t = {0};
    t.tm_year = _ymd.year().operator int() - 1900;
    t.tm_mon = _ymd.month().operator unsigned int();
    t.tm_mday = _ymd.day().operator unsigned int();
    time_t timeSinceEpoch = mktime(&t);
    std::cout << "timeSinceEpoch " << timeSinceEpoch << "\n"; // it will be in my time zone, not UTC

字符串

sgtfey8w

sgtfey8w1#

我注意到你使用的是Windows。最近版本的MSVC附带了C20 <chrono>的完整实现。这使我的日期库过时了。我的建议是使用C20 <chrono>。虽然由于某种原因你不能,我很乐意帮助。
你的第一次尝试是正确的。但出于某种原因,它似乎不正确:

date::year_month_day _ymd = date::year{2023}/11/9; // November 9, 2023

// Modern C++
// The following returns 16994880000000000
// = Thursday, July 16, 1970 4:48:00 PM, which is not 2023/11/09
std::chrono::system_clock::time_point tp = 
        std::chrono::time_point<std::chrono::system_clock, std::chrono::days>(std::chrono::sys_days{_ymd});

字符串
Windows system_clock::time_point以1/10微秒(十进制微秒)为单位计数。其中1699488000000000的刻度是2023-11-09 00:00:00.0000000 UTC。从您的注解中可以看出,您似乎将1699488000000000解释为纳秒计数而不是十进制微秒。如果您显示解释1699488000000000的代码,则会有所帮助。
虽然你的代码是正确的,但它也过于冗长。在功能不变的情况下,它可以简化为:

std::chrono::system_clock::time_point tp = std::chrono::sys_days{_ymd};


类型sys_daystime_point<system_clock, days>的类型别名,因此您实际上插入了一个免费的复制构造。
如果你想把结果作为纳秒的计数,这也很容易做到:

std::chrono::sys_time<std::chrono::nanoseconds> tp = std::chrono::sys_days{_ymd};


现在tp.time_since_epoch().count()是16994880000000000(最后多了两个零)。

相关问题