C++ C++;-比较两个日期

C++ C++;-比较两个日期,c++,time,C++,Time,我正在写一个应用程序,需要比较两个日期的可能性。这就是我到目前为止所做的: struct entry { string text; string date; // format: dd.mm.yyyy bool finished; }; string addNulls(int number, int cols) { string num = to_string(number); if (num.size() < cols) { i

我正在写一个应用程序,需要比较两个日期的可能性。这就是我到目前为止所做的:

struct entry {
    string text;
    string date; // format: dd.mm.yyyy
    bool finished; 
};

string addNulls(int number, int cols) {
    string num = to_string(number);
    if (num.size() < cols) {
        int count = cols - num.size();
        for (int i = 0; i < count; i++) {
            num = "0" + num;
        }
    }
    return num;
}

// [...]

entry e = {"here is some text", "21.03.2019", false};

int day2 = atoi(e.date.substr(0, 2).c_str());
int month2 = atoi(e.date.substr(3, 2).c_str());
int year2 = atoi(e.date.substr(6, 4).c_str());

time_t t = time(0);
struct tm * now = localtime(&t);

string date1 = e.date.substr(6, 4) + "-" + e.date.substr(3, 2) + "-" + e.date.substr(0, 2) + " 00:00:00";
string date2 = addNulls(now->tm_year, 4) + "-" + addNulls(now->tm_mon, 2) + "-" + addNulls(now->tm_mday, 2) + " 00:00:00";

if(date2 > date1) {
    // do something
}
struct条目{
字符串文本;
字符串日期;//格式:dd.mm.yyyy
布尔完成;
};
字符串addNulls(整数,整数列){
string num=到_字符串(数字);
if(num.size()tm\u year,4)+“-”+addNulls(现在->tm\u mon,2)+“-”+addNulls(现在->tm\u mday,2)+“00:00:00”;
如果(日期2>日期1){
//做点什么
}
代码获取一个包含日期的“entry”结构。然后代码将日期与实际时间进行比较。问题是,它不起作用!我使用一些示例内容运行了一些测试,但结果(date2>date1)返回false

为什么?


我读到:

为什么不使用
strtime
解析日期字符串,将其转换为历元时间,然后进行比较

 #include <time.h>

 char *
 strptime(const char *restrict buf, const char *restrict format,
     struct tm *restrict tm);
#包括
煤焦*
strtime(常量字符*限制buf,常量字符*限制格式,
struct tm*restrict tm);

我不是在回答你的问题。然而,我为你提供了一个解决方案。您考虑过日期/时间库吗?很受欢迎

如果您是在C++11或更高版本中编译,我建议您这样做,因为它只是标题(不需要链接到boost之类的库),而且我认为它的语法更清晰(这是一个非常主观和有偏见的观点)

后一个库构建在C++11
库的基础上。以下是使用此库的示例代码:

#include "date.h"
#include <iostream>
#include <string>

struct entry {
    std::string text;
    date::year_month_day date;
    bool finished; 
};

int
main()
{
    entry e = {"here is some text", date::day(21)/3/2019, false};
    auto day2 = e.date.day();
    auto month2 = e.date.month();
    auto year2 = e.date.year();
    auto t = std::chrono::system_clock::now();
    auto date1 = date::sys_days{e.date};
    auto date2 = t;
    if (date2 > date1)
        std::cout << "It is past " << e.date << '\n';
    else
        std::cout << "It is not past " << e.date << '\n';
}
在C++14中,计时文字使指定文字时间变得非常紧凑:

using namespace std::literals;
auto date1 = date::sys_days{e.date} + 0h + 0min + 0s;
同样在文字主题上,如果使用名称空间日期插入
,则可以使
条目的构造稍微紧凑一些

entry e = {"here is some text", 21_d/3/2019, false};

重用date或datetime类,甚至创建自己的类,都比尝试使用字符串保存日期容易。此外,当您打算向时间点添加持续时间时,您还可以获得类型安全性,即不会意外地向日期添加字符串。

通过比较两个日期,没有为
std::string
定义
运算符。你期待什么?@πάνταῥεῖ 但是,如果您以ISO格式
YYYY-MM-DD
表示两个日期,则此类字符串的字典比较也会正确排序日期。
tm_year
存储实际年份减去1900;e、 g.2015年用105表示。类似地,
tm_月
是以零为基础的:1月为0,12月为11。如果您在比较之前尝试了最小程度的调试,并实际查看了
date1
date2
的内容,您会注意到您自己。@IgorTandetnik那么OP应该清楚比较的实际输入由什么组成。@πάνταῥεῖ OP显示了在比较之前构造两个字符串的代码。我觉得很清楚。有几个理由不这么做。例如,(1)它不是标准C++,(2)它是C为中心的指针。同意,但是@保罗已经使用了 LoalTime< /C>和 Time/Cudio>,这是以C为中心的(实际上在同一个头中定义了代码>时间。h < /代码>作为代码> StrutTime/COD>)。这在技术上是不正确的。代码> <代码>是标准的C++头文件。code>strtime
是该标题内容的非标准扩展。更多信息:
entry e = {"here is some text", 21_d/3/2019, false};