C ++比较2个日期并检查分钟差异

时间:2015-09-23 14:47:38

标签: c++ json datetime jsoncpp

这就是事情:

使用DateTime.Now使用C#创建日期时间访问。此日期时间通过JSON传递给C ++方法。我正在使用JsonCpp来处理Json数据,但我不确定如何处理数据是一个日期时间。

我想将我收到的这个日期时间与实际日期时间进行比较,并检查这两者之间的分钟差异(如果差异是在定义的时间间隔内)。

如果我使用JsonCpp将Json日期时间转换为字符串,我有以下格式:

2015-06-08T11:17:23.746389-03:00

所以我要做的就是这样:

var d1 = oldAccess["Date"].ToString(); //Json datetime converted to a string
var d2 = actualAccess["Date"].ToString()
if((d2 - d1) < 20) { //Difference between the two dates needs to be less than 20 minutes
    return true;
} else return false;

我是C ++的新手,甚至在寻找我没有发现如何做到这一点。

1 个答案:

答案 0 :(得分:2)

嗯,我明白了。不是最好的方式,不是漂亮的方式,但是它起作用,因为我知道这两个日期是在同一台服务器上设置的,并且始终采用相同的格式\"2015-01-01T23:40:00.000000-03:00\"

这就是我的所作所为:

int convertToInt(std::string number_str){
    int number;
    std::istringstream ss(number_str);
    ss.imbue(std::locale::classic());
    ss >> number;
    return number;
}

time_t convertDatetime(std::string date_str) {
    time_t rawtime;
    struct tm date;
    int year, month, day, hour, min, sec;

    date_str.erase(std::remove_if(date_str.begin(), date_str.end(), isspace), date_str.end());

    year = convertToInt(date_str.substr(1, 4));
    month = convertToInt(date_str.substr(6, 2));
    day = convertToInt(date_str.substr(9, 2));
    hour = convertToInt(date_str.substr(12, 2));
    min = convertToInt(date_str.substr(15, 2));
    sec = convertToInt(date_str.substr(18, 2));

    time(&rawtime);
    localtime_s(&date, &rawtime);
    date.tm_year = year - 1900;
    date.tm_mon = month - 1;
    date.tm_mday = day;
    date.tm_hour = hour;
    date.tm_min = min;
    date.tm_sec = sec;

    return mktime(&date);
}

bool isValidIntervalDatetime(std::string actualDatetime_str, std::string oldDatetime_str, int maxMinutesInterval) {
    double maxSecondsInterval = 60 * maxMinutesInterval;
    time_t actualDatetime = convertDatetime(actualDatetime_str);
    time_t oldDatetime = convertDatetime(oldDatetime_str);

    double secondsDiff = difftime(actualDatetime, oldDatetime);

    return secondsDiff <= maxSecondsInterval;
}

int main(int argc, char* argv[])
{
    auto maxMinutesInterval = 20;
    auto actuaDatetime = JsonConverter::toString(actualAccess["Date"]); // \"2015-01-02T00:00:00.000000-03:00\"
    auto oldDatetime = JsonConverter::toString(oldAccess["Date"]); // \"2015-01-01T23:40:00.000000-03:00\"

    if (isValidIntervalDatetime(actuaDatetime, oldDatetime, maxMinutesInterval){
        //do something
    }
}