繁体   English   中英

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

[英]How do I portably add a large number of seconds to a time_t object?

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

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

我将如何便携地进行此操作(即根据C标准)?

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

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

您可以相隔一秒设置两个struct tm对象(在某个地方中间选择两次,不允许发生闰秒,以及在DST不更改的本地时间),并调用mktime() on他们两个都得到两个time_t值。 从较晚的时间中减去那些time_t值中的较早值,这将为您提供在系统上测量time_t的相同单位数的秒。 将其乘以要添加的秒数,并将结果添加到原始time_t值。 您可以通过再次调用原始和新time_t值上的difftime()来检查结果,以查看秒差是否与您预期的差异。

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

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

好像一个重复

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM