繁体   English   中英

将 C# 日期时间转换为 C++ std::chrono::system_clock::time_point

[英]Convert C# DateTime to C++ std::chrono::system_clock::time_point

我需要在 C++/CLR 代码中,将来自 C# 的DateTime转换为 C++ std::chrono::system_clock:time_point等效项。

该代码是否可以完成该工作,有没有更好的方法来做到这一点?

std::chrono::system_clock::time_point ConvertDateTime(DateTime dateTime)
{
    Int32 unixTimestamp = (Int32)(dateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
    std::chrono::system_clock::time_point ret = std::chrono::system_clock::from_time_t(unixTimestamp );

    return ret;
}

我不认为您的代码有效,尽管我没有可用于测试的DateTime (我不在 Windows 上)。 UtcNow是一个“静态”函数,它返回表示为“当前 UTC 时间”的当前值,这可能意味着:超过 1970-01-01 00:00:00 UTC 的持续时间。 我相信您的公式与您的参数dateTime的值无关。

我建议根据DateTime.Ticks进行交易,它是 0001-01-01 00:00:00 UTC 之后的 100 纳秒滴答数,其中 UTC 是预测性定义的。

使用这个免费的、开源的、仅头文件的库,您可以很容易地根据 VS 使用的 100 纳秒滴答找到DateTime纪元和system_clock纪元之间的差异:

首先将ticks定义为 100 纳秒单位很方便:

using ticks = std::chrono::duration<std::int64_t,
                 std::ratio_multiply<std::ratio<100>, std::nano>>;

然后ConvertDateTime可以写成:

std::chrono::system_clock::time_point
ConvertDateTime(DateTime dateTime)
{
    using namespace date;
    using namespace std::chrono;
    return system_clock::time_point{ticks{dateTime.Ticks}
                - (sys_days{1970_y/jan/1} - sys_days{0001_y/jan/1})};
}

如果你真的不喜欢使用这个日期库的想法,那么你可以在上面的函数中硬编码一个魔术常量,如下所示:

std::chrono::system_clock::time_point
ConvertDateTime(DateTime dateTime)
{
    using namespace std::chrono;
    return system_clock::time_point{ticks{dateTime.Ticks - 621355968000000000}};
}

其中任何一个都会为您提供一个system_clock::time_point ,其精度与DateTime (在 VS 上)完全相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM