![](/img/trans.png)
[英]How do I represent a time difference in an `std::time_t` variable as days, hours, minutes and seconds?
[英]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
结构。 您可能会遇到溢出问题,并且有足够长的秒数,这些都是您无法做到的。
使用localtime
将time_t
值转换为struct tm
,它将时间分解为小时,分钟,秒等。适当调整秒数,然后使用mktime
将结构中的值转换为time_t
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.