【问题标题】:c++ date difference between two datesc++ 两个日期之间的日期差
【发布时间】:2016-04-27 16:39:10
【问题描述】:

我正在尝试制作一个读取两个日期并选择较大日期的函数,然后以天为单位获取差异。到目前为止,我已经尝试了很多,但有时答案不正确。
我找不到问题出在哪里。谁能帮我找到问题,和/或就如何调试此类问题提供一些建议?

#include < iostream >
#include < string.h >
#include < string>
#include < cstdlib >
#include < sstream >
using namespace std;
int period(string days1, string months1, string years1, string days2,string months2, string years2)
{
int periodday, periodmonth, periodyear, periodindays,
year1 = atof(years1.c_str()), month1 = atof(months1.c_str()),
day1 = atof(days1.c_str()), year2 = atof(years2.c_str()),
month2 = atof(months2.c_str()), day2 = atof(days2.c_str());
int biggeryear, smalleryear, biggermonth, smallermonth, biggerday, smallerday;
if (year1 > year2) {
    biggeryear = year1;
    biggermonth = month1;
    biggerday = day1;
    smalleryear = year2;
    smallermonth = month2;
    smallerday = day2;
    }
else {
    biggeryear = year2;
    biggermonth = month2;
    biggerday = day2;
    smalleryear = year1;
    smallermonth = month1;
    smallerday = day1;
}
if (year1 == year2) {
    if (month1 > month2) {
        biggeryear = year1;
        biggermonth = month1;
        biggerday = day1;
        smalleryear = year2;
        smallermonth = month2;
        smallerday = day2;
    }
    else {
        biggeryear = year2;
        biggermonth = month2;
        biggerday = day2;
        smalleryear = year1;
        smallermonth = month1;
        smallerday = day1;
    }
    if (month1 == month2) {
        if (day1 > day2) {
            biggeryear = year1;
            biggermonth = month1;
            biggerday = day1;
            smalleryear = year2;
            smallermonth = month2;
            smallerday = day2;
        }
        else {
            biggeryear = year2;
            biggermonth = month2;
            biggerday = day2;
            smalleryear = year1;
            smallermonth = month1;
            smallerday = day1;
        }
    }
}
periodday = biggerday - smallerday;
periodmonth = biggermonth - smallermonth;
periodyear = biggeryear - smalleryear;
if (periodday < 0) {
    periodmonth = periodmonth - 1;
    if (biggermonth == 1 || biggermonth == 3 || biggermonth == 5 ||
    biggermonth == 7 || biggermonth == 8 | biggermonth == 12 ||
    biggermonth == 10) {
        periodday += 31;
    }
    if (biggermonth == 4 || biggermonth == 6 || biggermonth == 9 ||
    biggermonth == 11) {
        periodday += 30;
    }
    if (biggermonth == 2 && biggeryear == 0) {
        periodday += 28;
    }
    if (biggermonth == 1 && biggeryear % 4 != 0) {
        periodday += 29;
    }
}
if (periodmonth < 0) {
    periodyear--;
    if (biggermonth == 1 || biggermonth == 3 || biggermonth == 5 ||
    smallermonth == 7 || biggermonth == 8 || biggermonth == 12 ||
    biggermonth == 10)
    {
        periodmonth = periodmonth + 12;
        periodmonth = abs(periodmonth) * 31;
    }
    if (biggermonth == 4 || biggermonth == 6 || biggermonth == 9 ||
    biggermonth == 11) {
        periodmonth = periodmonth + 12;
        periodmonth = abs(periodmonth) * 30;
    }
    if (biggermonth == 2 && biggeryear % 4 == 0) {
        periodmonth = periodmonth + 12;
        periodmonth = abs(periodmonth) * 28;
    }
    if (biggermonth == 2 && biggeryear % 4 != 0) {
        periodmonth = periodmonth + 12;
        periodmonth = abs(periodmonth) * 29;
    }
}
else if (periodmonth >= 0) {
    if (biggermonth == 1 || biggermonth == 3 || biggermonth == 5 ||
    biggermonth == 7 || biggermonth == 8 || biggermonth == 12 ||
    biggermonth == 10) {
        periodmonth = periodmonth * 31;
    }
    if (biggermonth == 4 || biggermonth == 6 || biggermonth == 9 ||
    biggermonth == 11) {
        periodmonth = periodmonth * 30;
    }
    if (biggermonth == 2 && biggeryear % 4 == 0) {
        periodmonth = periodmonth * 28;
    }
    if (biggermonth == 2 && biggeryear % 4 != 0) {
        periodmonth = periodmonth * 29;
    }
}
if (periodyear < 0) {
    if (year1 % 4 != 0 || year2 % 4 != 0) {
        periodyear = year2 - year1;
        periodyear *= 366;
    }
    else {
        periodyear = year2 - year1;
        periodyear *= 365;
    }
}
else if (periodyear >= 0) {
    if (year1 % 4 != 0 || year2 % 4 != 0) {
        periodyear *= 366;
    }
    else {
        periodyear *= 365;
    }
}
periodindays = periodday + periodmonth + periodyear;
return abs(periodindays);
}
int main()
{
    string daya = ("1"), montha = ("1"), yeara = ("2016"), yearb = ("2016"),
    monthb = ("4"), dayb = ("27");
    int difference;
    difference = period(daya, montha, yeara, dayb, monthb, yearb);
    cout << difference << endl;
    system("pause");
    return 0;
}

【问题讨论】:

  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs
  • 编辑您的帖子以获得正确的缩进 - 否则没有人会认真对待这个网站,哈哈。如果你这样做,我可以看看发生了什么。
  • 添加失败和通过的输入。
  • 玉莎我不懂你
  • 我尝试的日期给了我 116 的差异,而应该是 118

标签: c++ string function date


【解决方案1】:

我认为你做的事情有点复杂。我的建议是通过在 struct tm 中设置适当的字段并使用 mktime() 将您的日期转换为 time_t 值。然后,您可以使用 difftime() 计算两个日期之间的秒数差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2011-06-06
    相关资源
    最近更新 更多