【问题标题】:Difference between two timestamps in days C++天数 C++ 中两个时间戳之间的差异
【发布时间】:2018-10-15 15:38:37
【问题描述】:

我在 XML 文件中有格式为 (Year.Month.Day) 的时间戳。

我需要找出两个时间戳之间的天数差异。

示例时间戳:

<Time Stamp="20181015">

<Time Stamp="20181012">

我怎样才能找到上述时间戳之间的天数?

天数 = date2 - date1。我正在考虑所有的日子(不需要跳过周末或任何其他日子)。时区也不重要。

PS:我知道我必须从 XML 中解析时间戳。解析值后陷入逻辑。

Update-1: std::chrono::year 和其他类似的东西是 C++20 的一部分。但我得到一个编译错误:

命名空间“std::chrono”没有成员“year”

【问题讨论】:

  • 1.定义“日”。 2.你看过C++ date handling functions吗?
  • @tadman:我已经更新了我的问题。我不确定在这种情况下如何使用 chrono 库,因为我已经在 XML 文件中有时间戳。
  • 它本身不是一个库,它是内置在 C++ 中的。您将不得不使用您选择的 XML 解析器从 XML 中提取值,然后将该日期用于日期解析函数之一或使用外部日期计算库。
  • 我要求定义“天”的原因是,如果时区是一个因素,那么天就会变得复杂。如果只是日历差异,那就容易多了。
  • C++20 只需使用标准库就可以轻松完成。与此同时,也许 Boost 的日期时间库? Example 用于计算两个时间点之间的天数。

标签: c++ timestamp timespan


【解决方案1】:

有一种老式的方式:

#include <ctime>
#include <iomanip> // std::get_time
#include <sstream>

// ... 

std::string s1 = "20181015";
std::string s2 = "20181012";

std::tm tmb{};

std::istringstream(s1) >> std::get_time(&tmb, "%Y%m%d");
auto t1 = std::mktime(&tmb);

std::istringstream(s2) >> std::get_time(&tmb, "%Y%m%d");
auto t2 = std::mktime(&tmb);

auto no_of_secs = long(std::difftime(t2, t1));

auto no_of_days = no_of_secs / (60 * 60 * 24);

std::cout << "days: " << no_of_days << '\n';

【讨论】:

  • 我得到了0 days 作为上面代码的输出。此外,编译器无法解析&gt;&gt; 操作数。它说more than one operator matches these operands
  • 是的,它编译并生成错误的输出。而且,在我的 VS2015 代码中,我在 &gt;&gt; 下方看到红色突出显示,上面写着 more than one operator matches these operands。我已经包含了iomanip
  • @skm 你在用C++11吗?
  • @skm 我认为 VS2015+ 有一个错误 std::get_time... stackoverflow.com/questions/35041344/…
【解决方案2】:

您现在可以通过下载Howard Hinnant's free, open-source date/time library 使用 C++20 的语法(使用 C++11/14/17)。语法如下所示:

#include "date/date.h"
#include <iostream>
#include <sstream>

int
main()
{
    using namespace date;
    using namespace std;
    istringstream in{"<Time Stamp=\"20181015\">\n<Time Stamp=\"20181012\">"};
    const string fmt = " <Time Stamp=\"%Y%m%d\">";
    sys_days date1, date2;
    in >> parse(fmt, date1) >> parse(fmt, date2);
    cout << date2 - date1 << '\n';
    int diff = (date2 - date1).count();
    cout << diff << '\n';
}

这个输出:

-3d
-3

如果您不需要时区支持(如本例所示),那么 date.h 是一个单头、仅头的库。 Here is the full documentation.

如果您需要时区支持,则需要一个带有标头和源代码的附加库:tz.h/tz.cpp。这是documentation for the time zone library

【讨论】:

  • 我觉得我没有C++20还能用吗?
  • 您需要 C++11 或更高版本。
  • 我正在尝试构建它,但我收到有关 C 和 CXX 编译器的错误。其中一个错误是“CMakeLists.txt:3(项目)的 CMake 错误:找不到 CMAKE_CXX_COMPILER。”
  • 对于这个操作,你需要做的就是#include "date/date.h"并将你的编译器指向date/include目录。无需担心构建日期库。
  • 愚蠢的问题,但我无法真正理解in{ "&lt;Time Stamp=\"20181015\"&gt;\n&lt;Time Stamp=\"20181012\"&gt;" } 这行。此外,在从 XML 解析字符串之后,我将在单独的字符串变量中包含时间戳。
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多