6

好吧,我认为标题总结了它。假设我有一个类型的对象,它是通过在两个对象上double运行而获得的,现在我想将得到的秒数添加回一个对象。我不介意失去几分之一秒。std::difftimetime_ttime_t

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

我将如何以便携方式进行此操作(即按照 C 标准)?

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

4

3 回答 3

3

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

于 2013-09-21T13:02:17.387 回答
3

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

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

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

于 2013-09-21T13:50:48.967 回答
-3

似乎是this的副本。

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

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

于 2013-09-21T13:01:08.107 回答