【问题标题】:Add two dates in C++在 C++ 中添加两个日期
【发布时间】:2012-09-15 23:29:33
【问题描述】:

我确定这个问题在其他地方得到了解答,但我在 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++ 库中肯定有办法做到这一点吗?

【问题讨论】:

  • 你可以看看 boost 日期时间库。 boost.org/doc/libs/1_51_0/doc/html/date_time.html
  • 您问的是 C 还是 C++?它们是不同的语言,每种语言都有不同的库。
  • 澄清一下:我更喜欢用 C 编写它,或者使用类似 C 的 C++ 库(例如 time.h),但如果它们做得更好,可以使用其他 C++ 库。跨度>

标签: c++ c time ctime


【解决方案1】:

使用Boost::Date_Time 库。

【讨论】:

  • 或者标准的chrono library,如果这真的是一个 C++ 问题
  • @SethCarnegie:那不处理日期和日历。
【解决方案2】:

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

【讨论】:

  • 我会强烈建议不要这样做,你会错过 DST 调整以及时间调整。我们在标准库中有解析之类的东西是有原因的。
  • OP 说天-小时-分钟-秒是一个相对时间......相对时间没有 DST 和时间调整。 3天就是3天,期间。时间和相对时间之间的任何时间调整都由 gmtime 处理。另请注意:UTC 中没有 DST。
  • 这大概是我想要的。令人惊讶的是,没有使用 tm 结构执行此操作的本机函数。似乎是一件相当普遍的事情......
【解决方案3】:

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

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

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

【讨论】:

  • mktimegmtime 是标准 C++ 的一部分,可能足以满足他想做的事情。我认为,基于 Boost,C++11 添加了相当多的附加功能。 (我没有时间研究标准版本,但 Boost 的东西设计得非常好。)
  • @JamesKanze:C++11 chrono 库不包含任何日期或日历处理;如果 C 库不够用,您将需要 Boost(或其他)。
  • 所以我明白了(已经查过了)。您无法在日/月/年表示之间进行转换这一事实限制了它的实用性。
【解决方案4】:

您尝试做的事情没有意义。您不能添加两个日期。 (并且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 和一个 duration 类,(一眼看去)似乎拥有所有 您可能需要的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多