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

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

本文关键字:添加 对象 可移植 time      更新时间:2023-10-16

嗯,我认为标题总结了它。假设我有一个 double 类型的对象,它是我在两个time_t对象上运行 std::difftime 获得的,现在我想将生成的秒数加回time_t对象。我不介意损失几分之一秒。

请注意,秒数可能很大(即大于 struct tm 中允许的 60 秒,但始终低于用于表示相应机器/实现上的秒的任何整数原语,并且永远不会大于 1 年的数量级,尽管最好我不希望这是一个限制)。

我将如何可移植地执行此操作(即根据 C 标准)?

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

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

您可以设置两个相隔一秒的struct tm对象(在一分钟中间的某个位置选择两次,不允许发生闰秒,以及在 DST 不会更改的本地时间),并对它们调用mktime()以获取两个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++ :)