将 C# 日期时间转换为 C++ std::chrono::system_clock::time_point
本文关键字:chrono system clock point time std 日期 时间 转换 C++ | 更新日期: 2023-09-27 18:06:54
我需要在 C++/CLR 代码中将来自 C# 的DateTime
转换为等效C++ std::chrono::system_clock:time_point
。
该代码会完成工作吗 os 有更好的方法吗?
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}};
}
其中任何一个都可以为您提供与DateTime
完全相同的精度(在VS上(的system_clock::time_point
。