2016-01-12 22 views
3

我想知道特定時代以來的當前時間(以毫秒爲單位)。 2016年1月1日。如何在C++中爲std :: chrono :: steady_clock設置時期?

這樣做的原因是爲了避免使用8字節的std :: chrono :: milliseconds。
我想將結果存儲在4字節數據類型中。

std :: chrono :: steady_clock()使用未指定的默認紀元。

+0

相關:http://stackoverflow.com/questions/33964461/handling-julian-dates-in-c11-14 –

+2

我建議你去爲自己創建自己的時鐘類,它從'現在是'time_point <時鐘,持續時間>' – David

回答

1

您可以按照David的評論建議的方式創建自己的時鐘。

#include "date.h" 
#include <cstdint> 
#include <iostream> 

struct myclock 
{ 
    using rep  = std::int32_t; 
    using period  = std::milli; 
    using duration = std::chrono::duration<rep, period>; 
    using time_point = std::chrono::time_point<myclock>; 
    static constexpr bool is_steady = false; 

    static time_point now() noexcept 
    { 
     using namespace std::chrono; 
     using namespace date; 
     return time_point{duration_cast<duration>(system_clock::now() 
               - sys_days{jan/1/2016})}; 
    } 
}; 

static_assert(sizeof(myclock::time_point) == 4, ""); 
static_assert(sizeof(myclock::duration) == 4, ""); 

int 
main() 
{ 
    auto tp = myclock::now(); 
    std::cout << tp.time_since_epoch().count() << '\n'; 
} 

的表示被指定爲你指定爲int32_t,精度是毫秒,因爲你指定。

爲了獲得您指定的時代,我從this date library獲得了一個協助,這使得互操作日期和system_clock::time_point非常容易。我只需從system_clock::now()中減去所需的時間,並將該持續時間轉換爲myclock::duration(32位毫秒)。我

剛纔運行該程序的輸出:

1207186990 

這是13.97天。

你可以計算你的時鐘與此代碼範圍:

using namespace date; 
using namespace std::chrono; 
auto min = milliseconds{myclock::duration::min()} + sys_days{jan/1/2016}; 
auto max = milliseconds{myclock::duration::max()} + sys_days{jan/1/2016}; 
std::cout << min << '\n'; 
std::cout << max << '\n'; 

的顯式轉換到std::chrono::milliseconds是必要的,以避免溢出。這將輸出:

2015-12-07 03:28:36.352 
2016-01-25 20:31:23.647 

所以好點的快點。 myclock將在另外10天內溢出。 :-)

相關問題