繁体   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