簡體   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