如何向time_t对象可移植地添加大量秒数?

时间:2013-09-21 12:53:38

标签: c++ c++11

嗯,我认为标题总结了它。假设我有一个double类型的对象,我是通过在std::difftime个对象上运行time_t获得的,现在我想将结果秒数添加回time_t宾语。我不介意失去几秒钟。

请注意,秒数可能很大(即,大于struct tm中允许的60秒,但总是低于用于表示相应计算机/实现上的秒数的任何整数原语,并且永远不会大于1年的顺序,虽然我不希望这是一个限制)。

我如何进行便携式(即根据C标准)?

我希望不必分为几个月,几天,几小时,几分钟等,并将它们手动添加到struct tm对象。当然有更好的方法!?

3 个答案:

答案 0 :(得分:4)

您可以使用time_t值执行算术。

你可以相隔一秒设置两个struct tm个对象(在某个地方中间选择两次,不允许发生闰秒,以及在DST不变的当地时间),并在它们上面调用mktime()以获得两个time_t值。从后者中减去那些time_t值中较早的值,这将为您提供在系统中测量time_t的相同单位数的第二个值。将此值乘以您要添加的秒数,并将结果添加到原始time_t值。您可以再次在原始difftime()值上调用time_t来检查结果,看看秒差是否与您期望的差异。

请注意,即使这不是保证可移植,因为从技术上讲,time_t甚至不需要具有能够区分秒数的分辨率,但它会很漂亮奇怪的实施,没有。此外,如果time_t是浮点值(这是不常见的)并且您想要添加非常大的秒数,则可能会遇到浮点精度问题。在这种情况下,您可以尝试添加小时,而不是秒,并相应地设置两个struct tm结构。您可能会遇到溢出问题,并且有足够长的秒数,而您无法做太多。

答案 1 :(得分:3)

使用localtimetime_t值转换为struct tm,其中将时间分解为小时,分钟,秒等。适当调整秒数,然后使用mktime将结构中的值转换为time_t

答案 2 :(得分:-3)

似乎是this的副本。

“C日期/时间类型time_t实现为自特定日期以来的秒数,因此要为其添加秒数,只需使用常规算法。”

即使它在C语言中,C ++应该没有区别:)