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

标签 c++ datetime c++-chrono

我正在尝试将 Howard Hinnant 先生的库的 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

最佳答案

我注意到您正在使用 Windows。 MSVC 的最新版本附带了 C++20 的完整实现 <chrono> 。这使我的日期库过时了。我的建议是使用 C++20 <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 微秒(十微秒)为单位进行计数。其中 16994880000000000 个刻度是 2023-11-09 00:00:00.0000000 UTC。从您的评论来看,您似乎将 16994880000000000 解释为纳秒计数而不是十分之一微秒。如果您显示为您解释 16994880000000000 的代码,将会有所帮助。

尽管您的代码是正确的,但它也过于冗长。在功能不变的情况下,它可以简化为:

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()是 1699488000000000000(末尾多两个零)。

关于c++ - 如何将 date::year_month_day 转换为 chrono time_point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77457148/

相关文章:

c++ - 如何在 lex 中捕获多行

c++ - 转换运算符不适用于 sleep_until

c++ - 为什么计算 future 方向上从工作日 y 到工作日 x 的一天距离必须如此复杂?

c++ - 获取 chrono 中时间类型的名称

c++ - 在 C++ 中通过引用传递数组

c++ - 在 PCL 可视化器中打印选定点的 3D 坐标

c++ - CMake 无法找到 SDL2_ttf,我尝试以与 SDL2 相同的方式链接它,并且两者都正确安装在 Ubuntu 18.04 上

python - 如何将年份添加到 pandas 中的日期列

MySQL 查找每月的最大日期

javascript - Angularjs 日期过滤器将时间毫秒转换为 UTC 不起作用