在C++中添加两个日期

Add two dates in C++

本文关键字:两个 日期 C++ 添加      更新时间:2023-10-16

我确信这个问题在其他地方有答案,但我在谷歌或SO上找不到,所以就这样吧。

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

ps -o etime

到UTC格式的绝对日期。

这似乎不应该很难。假设我已经有了一个函数来产生存储在structtm格式中的相对时间:

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++库中肯定有办法做到这一点吗?

使用Boost::Date_Time库。

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

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

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

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

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

在实践中,在大多数(如果不是全部的话)实现中,time_t将是整型,自某个特定的"epoch"以来的秒数。在这样的机器上,你可以加或减一个整数秒从time_t获得新的时间,至少如果你一直感兴趣的是time_t支持的区间(大致介于1970和2038在大多数Unix平台上)。这与CCD_ 14一起,mktimelocaltime可能足以满足您的需求。笔记尤其是mktime需要"更正"它的tm输入:您例如,可以取一个tm,在字段tm_mday中加5,调用mktime,并在未来;所有必要的搬运操作和特殊条件在CCD_ 22中被处理。

如果这还不够,C++11同时具有time_pointduration类,具有(快速浏览)似乎具有您可能需要的功能。