7

我有一个double包含秒。我想将其转换为time_t.

我找不到完成此任务的标准功能。我必须手动填写time_t吗?

4

2 回答 2

6

的类型std::time_t未指定。

虽然没有定义,但它几乎总是一个整数值,保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数(不计算闰秒),对应于 POSIX 时间。

所以,只要在他们之间进行一个安全的演员阵容就可以了。还要注意可移植性(因为它的类型在标准中没有指定),并考虑从双精度转换为整数时不能适应的值。

于 2015-06-23T10:39:15.580 回答
3

计时库

正如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_point00:00:00 开始的秒数。因此,将“速度方程”的结果存储在 a 中可能会让传统主义者感到困惑。time_t

time_t如果您只是停止转换为a 而不是转换为 a ,那么您的代码的可读性将会得到提高,chrono::duration<double>因此我建议您不要再进一步:

chrono::duration<double>(input)
于 2018-05-23T19:10:19.340 回答