簡體   English   中英

如何在C ++中為std :: chrono :: steady_clock設置epoch?

[英]How to set epoch for std::chrono::steady_clock in C++?

我希望從特定時期(例如2016年1月1日)以毫秒為單位獲得當前時間。

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

std :: chrono :: steady_clock()使用未指定的默認時期。

以下是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 ,精度為毫秒,如您所指定。

為了獲得你指定的紀元,我得到了這個日期庫的幫助, 使得日期和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天內溢出。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM