我有一个double
包含秒。我想将其转换为time_t
.
我找不到完成此任务的标准功能。我必须手动填写time_t
吗?
的类型std::time_t
未指定。
虽然没有定义,但它几乎总是一个整数值,保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数(不计算闰秒),对应于 POSIX 时间。
所以,只要在他们之间进行一个安全的演员阵容就可以了。还要注意可移植性(因为它的类型在标准中没有指定),并考虑从双精度转换为整数时不能适应的值。
正如deepmax 的回答所指出的,类型time_t
是实现定义的。因此,演员阵容不能保证成功。值得庆幸的是,chrono 库显着提高了时间操作的能力。
为了演示如何做到这一点,我在 ideone 上放了一个 Live Example。
作为 chrono 库提供的改进功能的一个示例,可以使用包含秒的 double 来直接构造chrono::duration<double>
.
从那里,to_time_t
可以在 a 上使用,chrono::system_clock::time_point
所以只需chrono::system_clock::time_point
用我们的chrono::duration<double>
.
因此,给定几秒钟的时间,double input
我们可以完成一个独立于实现的转换,如下所示:
chrono::system_clock::to_time_t(chrono::system_clock::time_point(chrono::duration_cast<chrono::seconds>(chrono::duration<double>(input))))
虽然我们可以得到这个time_t
(或 a ),但传统上认为这是从协调世界时chrono::system_clock::time_point
00:00:00 开始的秒数。因此,将“速度方程”的结果存储在 a 中可能会让传统主义者感到困惑。time_t
time_t
如果您只是停止转换为a 而不是转换为 a ,那么您的代码的可读性将会得到提高,chrono::duration<double>
因此我建议您不要再进一步:
chrono::duration<double>(input)