2016-09-12 69 views
1

我需要在C++/CLR代碼中將來自C#的DateTime轉換爲等效的C++ std::chrono::system_clock:time_point將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; 
} 

回答

4

我不認爲你的代碼的工作,雖然我沒有DateTime可供測試(我不是在Windows上)做。 UtcNow是一個「靜態」函數,它返回表示爲「當前UTC時間」的當前時間,可能表示:1970-01-01 00:00:00 UTC之前的持續時間。我相信你的公式獨立於你的參數dateTime的價值。

我推薦以DateTime.Ticks的方式進行廣告投放管理,這是從1900-01-01 00:00:00 UTC開始的100納秒滴答數量,其中UTC是通過臨時的方式定義的。

使用此free, open source, header-only library,你可以很容易地發現在100納秒方面DateTime時代和system_clock時代的區別蜱VS用途:

它首先是方便地定義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{1900_y/jan/1})}; 
} 

如果你真的不喜歡使用this date library的想法,那麼你可以很難在上面的功能,像這樣編寫一個神奇的常數:

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

無論是其中的一個可以讓你使用完全相同的精度爲DateTime一個system_clock::time_point (在VS上)。

相關問題