簡體   English   中英

從雙創建一個std :: chrono :: high_resolution_clock :: time_point嗎?

[英]creating an std::chrono::high_resolution_clock::time_point from a double?

我有計時器,開始和停止時間存儲在SQLite數據庫中。

我想將其提取出來並創建std::chrono::high_resolution_clock::time_point以便我可以將它們與now進行比較,看看還剩下多少時間。

一個示例存儲時間: 14903312

typedef std::chrono::high_resolution_clock::time_point TP;

double _estimatedGrowFinish = o.getPlantTimeEstimatedGrowingStopped(); // `14903312`

TP _now = std::chrono::high_resolution_clock::now();

TP _end = ??

我只是看不到如何將已存儲的雙time_point值轉換為time_point ,可以在其中運行一些數學運算並確定還剩下多少時間或時間已經過去...

時間被放入數據庫中,例如:

std::chrono::high_resolution_clock::now() + std::chrono::seconds(20)

編輯:SQLite說關於日期和時間

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").

REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.

INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.

您將無法使用high_resolution_clock因為對於划時代此high_resolution_clock從平台而異。 例如,在我的平台(OS X)上,每當我啟動計算機時, high_resolution_clock的紀元。 從那時起,此時鍾僅數納秒。

system_clock也具有未指定的時期。 但是,我知道的所有3種實現都使用Unix Time作為其定義。 因此,如果您願意將此觀察作為事實,則可以通過減去這兩個時期之間的差異,輕松地在Julian時期和Unix時間時期之間轉換time_point s。

即將儒略式time_point轉換為Unix Time time_point減去從公元前4714年11月24日格林威治中午到UTC 1970-01-01 00:00:00的持續時間。

為幫助完成此任務,以下是一些方便且有效的日期算法:

http://howardhinnant.github.io/date_algorithms.html

例如,將這兩個時期之間的天數設為double

double const JulianEpoch = days_from_civil(-4714+1, 11, 24) - 0.5;

請注意+1,以將BC年轉換為多久的公歷年(1 BC是0年,2 BC是-1年,依此類推)。 我還減去了半天,以計算一個時期是中午,另一個時期是午夜。

如果estimatedGrowFinishJuliantime_point是一個time_point表示自朱利安時代以來的天數:

double estimatedGrowFinishJulian = getPlantTimeEstimatedGrowingStopped(); // `14903312`

然后,您可以獲取相對於Unix時間紀元的天數估算值:

double estimatedGrowFinishCivil = estimatedGrowFinishJulian + JulianEpoch;

請注意,這是一個time_point 並且它是一個time_point ,其time_pointstd::system_clock的實際時間一致。 您可以創建一個time_point 為此,首先方便地根據double來創建days

using days = std::chrono::duration
    <
        double,
        std::ratio_multiply<std::chrono::hours::period, std::ratio<24>>
    >;

現在您可以說:

days estimatedGrowFinish(estimatedGrowFinishJulian + JulianEpoch);

回想一下,這仍然是一個duration ,但是它表示自system_clock時期以來的天數。 因此,這實際上是一個time_point 您可以使用以下方法創建此類time_point的類型:

using DTP = std::chrono::time_point
    <
        std::chrono::system_clock,
        days
    >;

這是一個與system_clock相同的紀元的time_point ,它每天滴答一次,並將滴答計數存儲為兩倍。 現在你可以:

DTP end(days(estimatedGrowFinishJulian + JulianEpoch));

time_point可以與std::chrono::system_clock::now() time_point std::chrono::system_clock::now()並從std::chrono::system_clock::now() time_point std::chrono::system_clock::now()減去。 如果減去它們,您將獲得與std::chrono::system_clock::period相同的精度的duration std::chrono::system_clock::period ,但將其存儲為雙精度。 在我的系統上,這是一個duration<double, micro> 所以:

std::cout << (end - now).count() << '\n';

輸出從儒略時代過去的14903312天到現在(很遠的將來)之間的微秒數(兩倍)。

暫無
暫無

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

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