![](/img/trans.png)
[英]Precision of std::chrono::system_clock vs std::chrono::steady_clock across C++ implementations?
[英]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.