1

我确信这个问题在其他地方得到了回答,但我在 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

4 回答 4

3

使用Boost::Date_Time库。

于 2012-09-24T13:37:21.393 回答
2

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

于 2012-09-24T13:43:58.717 回答
1

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

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

如果您询问 C++,我建议您使用Boost.Date_Time库。当然,如果 C 库函数满足您的需要,它们仍然可用。

于 2012-09-24T13:45:06.310 回答
0

你试图做的事情没有意义。您不能添加两个日期。(并且difftime不返回日期,也不返回time_t.)

实际上,在大多数(如果不是全部)实现中,time_t将是一个整数类型,具有自某个特定“纪元”以来的秒数。在这样的机器上,您可以从 a 中添加或减去整数秒time_t以获得新时间,至少如果您感兴趣的所有时间都在time_t(在大多数 Unix 平台上大约在 1970 到 2038 之间)所支持的时间间隔内)。这与和gmtime一起 可能足以满足您的需求。特别注意“更正”它的输入所必需的:例如,您可以取 a ,将 5 添加到 field ,调用 它,mktimelocaltimemktimetmtmtm_mdaymktimemktime.

如果这还不够,C++11 既有 atime_point又有一个 duration类,其中(快速浏览)似乎拥有您可能需要的所有功能。

于 2012-09-24T14:28:13.420 回答