用C ++添加两个日期

时间:2012-09-24 13:33:44

标签: c++ c time ctime

我确定这个问题在其他地方得到了解答,但我无法在Google或SO上找到它,所以就这样了。

在C / C ++中,我想转换格式为dd -hh:mm的相对时间:由

提供的ss
ps -o etime

到绝对UTC格式的日期。

这似乎不应该很难。假设我已经有一个函数来生成以struct tm格式存储的相对时间:

struct tm *starting_rel_time = my_reltime_converstion(...);
time_t t = time(0);
struct tm *current_abs_time =  localtime(&t);

我想要的基本上与difftime相反:

struct *tm starting_abs_time = current_abs_time - starting_rel_time;

现在,我可以编写自己的功能来进行转换,但由于所有的进位操作和特殊条件(闰年等),这是一场噩梦。当然有一种方法可以在C / C ++库中做到这一点吗?

4 个答案:

答案 0 :(得分:3)

使用Boost::Date_Time个库。

答案 1 :(得分:2)

使用简单的数学运算将DD-HH:MM::SS转换为秒;它是相对时间,所以只需乘法和加法。然后,以秒为单位查询current time()(假设它是“相对于现在”),并添加它们。然后使用gmtime转换回struct tm

答案 2 :(得分:1)

没有C / C ++这样的语言。

如果你问的是C,我建议用一个简单的数字类型在内部表示日期,并仅在必要时转换为struct tm。如果您只需要覆盖几十年,那么您可以使用time_t并使用标准gmtimemktime库函数进行转换。为了覆盖更广泛的时间跨度,您可以使用Julian day表示。

如果你问的是C ++,我建议使用Boost.Date_Time库。当然,如果满足您的需求,C库函数仍然可用。

答案 3 :(得分:0)

你想要做的事情没有意义。您无法添加两个日期。 (并difftime不会返回日期,也不会返回time_t。)

在实践中,在大多数情况下,如果不是所有实现,time_t将是一个 积分类型,具有自某些特定“纪元”以来的秒数。 在这样的机器上,您可以添加或减去整数秒 从time_t获得新的时间,至少在所有时间都是如此 感兴趣的是time_t所支持的区间(大致在...之间) 1970年和2038年在大多数Unix平台上)。这与gmtime一起, mktimelocaltime可能足以满足您的需求。注意 特别需要mktime来“纠正”它的tm输入:你 例如,可以使用tm,向字段tm_mday添加5,然后调用 mktime就可以了,并获取日期中五天的正确值 未来 - 所有必要的携带操作和特殊 条件在mktime处理。

如果这还不够,C ++ 11同时具有time_point和a duration课程,(从快速浏览一下)似乎拥有全部 你可能需要的功能。