Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C或C+中比较日/月/年+;?_C++_C_Date_Comparison - Fatal编程技术网

C++ 如何在C或C+中比较日/月/年+;?

C++ 如何在C或C+中比较日/月/年+;?,c++,c,date,comparison,C++,C,Date,Comparison,我有一个程序,要求用户输入日期,然后它会显示哪一个是最近的我这样做了 if (year1>year2 || month1>month2 || day1>day2) return -1; if (year1<year2 || month1<month2 || day1<day2) return +1; if(year1>year2 | | month1>month2 | | day1>day2) 返回-1; 如果(第1年你需要一个更复杂的检查

我有一个程序,要求用户输入日期,然后它会显示哪一个是最近的我这样做了

if (year1>year2 || month1>month2 || day1>day2)
    return -1;

if (year1<year2 || month1<month2 || day1<day2)
    return +1;
if(year1>year2 | | month1>month2 | | day1>day2)
返回-1;

如果(第1年你需要一个更复杂的检查:

if (year1 > year2)
    return -1;
else if (year1 < year2)
    return +1;

if (month1 > month2)
    return -1;
else if (month1 < month2)
    return +1;

if (day1 > day2)
    return -1;
else if (day1 < day2)
    return +1;

return 0;
if(第1年>第2年)
返回-1;
否则如果(第1年<第2年)
返回+1;
如果(月1>月2)
返回-1;
否则如果(月1<月2)
返回+1;
如果(第1天>第2天)
返回-1;
否则如果(第1天<第2天)
返回+1;
返回0;

注意:返回第一个
-1
的值大于第二个值对我来说似乎是违反直觉的,但是我遵循了OP提供的语义。这里有一个干净的方法:

#include <tuple> // for std::tie

auto date1 = std::tie(year1, month1, day1);
auto date2 = std::tie(year2, month2, day2);

if (date1 == date2)
  return 0;

return (date1 < date2) ? -1 : 1; 
此声明

if (year1>year2 || month1>month2 || day1>day2)
    return -1;
测试三个条件中的任何一个是否为真。因此,如果year1高于Year2,或者month1高于month2。让我们到此为止。考虑一下

year1 = 2013, month1 = 12, day1 = 31;
year2 = 2014, month2 = 1, day1 = 1;
我们知道,事实上,year2是一个更高的值,但是发生的是

is year1 > year2? no
ok, but is month1 > month2? yes
这使它看起来像是第一年是一个更高的值,但它不是,它只是一个更高的月值

当你深入C++时,你会发现尝试采用一个约定来让所有的比较使用一个操作符(<或>)是个好主意,当你到达一个你和操作符一起工作的地方时,你就会明白为什么。
if (year2 < year1)
    return 1;
// we reach this line when year1 <= year2
if (year1 < year2) // elimnate the < case
    return -1;

// having eliminated both non-matches,
// we know that by reaching point that both
// dates have the same year. Now repeat for
// the month value.
if (month2 < month1)
    return 1;
if (month1 < month2)
    return -1;

// year and month must be the same, repeat for day.
if (day2 < day1)
    return 1;
if (day1 < day2)
    return -1;
return 0; // exact match
if(第2年<第1年)
返回1;
//当year1//你可以试试这个

int lday,lmonth,lyear;
int nday,nmonth,nyear;
int lhour,lminute;
int nhour,nminute;
sscanf(New_Time,"%d-%d",&nhour,&nminute); //reads the numbers
sscanf(Last_Time,"%d-%d",&lhour,&lminute); //from the string
sscanf(New_Date,"%d-%d-%d",&nday,&nmonth,&nyear);
sscanf(Last_Date,"%d-%d-%d",&lday,&lmonth,&lyear);
//cout << "Last date: " << lday << "-" << lmonth << "-" << lyear  <<endl;
//cout << "New date: " << nday << "-" << nmonth << "-" << nyear  <<endl;

if(nyear>lyear)
    return 0;
if(nyear==lyear) {
    if(nmonth > lmonth)
        return 0;
    if (nmonth == lmonth) {
        if(nday > lday)
            return 0;
        if (nday == lday) {
            if( nhour > lhour)
                return 0;
            if( nhour == lhour) {
                if(nminute>lminute) {
                    //cout << "new time >= last time" << endl <<endl;
                    return 0;
                }
                else return 1;
            }
            else return 1;
        }
        else return 1;
    }
    else return 1;
}
else return 1;
int-lday,lmon,lyear;
内恩代、恩蒙特、尼亚尔;
内小时,分钟;
内小时,分钟;
sscanf(新时间,“%d-%d”、&n小时,&n分钟);//读取数字
sscanf(最后一次,%d-%d),&lhour,&lminute);//来自字符串
sscanf(新日期,“%d-%d-%d”、&nday、&nmonth、&nyear);
sscanf(最后日期,“%d-%d-%d”、&lday、&lmon、&lyear);

//cout,你的逻辑是错误的,这与C++无关。只是想一想。你需要的是一年、月、日的词典比较。按顺序你试过写一些样本日期和尝试逻辑吗?比较2013-1231,2014-01-01.可能是一个好主意,显示整个事情在TE中。单个比较运算符的rms,可能运算符@kfsone同意,但是OP没有为测试提供足够的上下文。因此我提供了一个替换项。很高兴您还提供了一个返回,用于日期相同的情况。@Rob谢谢。我想OP的前后顺序是
-1
+1
呃,但是我是按照他提供的密码来做的。
int lday,lmonth,lyear;
int nday,nmonth,nyear;
int lhour,lminute;
int nhour,nminute;
sscanf(New_Time,"%d-%d",&nhour,&nminute); //reads the numbers
sscanf(Last_Time,"%d-%d",&lhour,&lminute); //from the string
sscanf(New_Date,"%d-%d-%d",&nday,&nmonth,&nyear);
sscanf(Last_Date,"%d-%d-%d",&lday,&lmonth,&lyear);
//cout << "Last date: " << lday << "-" << lmonth << "-" << lyear  <<endl;
//cout << "New date: " << nday << "-" << nmonth << "-" << nyear  <<endl;

if(nyear>lyear)
    return 0;
if(nyear==lyear) {
    if(nmonth > lmonth)
        return 0;
    if (nmonth == lmonth) {
        if(nday > lday)
            return 0;
        if (nday == lday) {
            if( nhour > lhour)
                return 0;
            if( nhour == lhour) {
                if(nminute>lminute) {
                    //cout << "new time >= last time" << endl <<endl;
                    return 0;
                }
                else return 1;
            }
            else return 1;
        }
        else return 1;
    }
    else return 1;
}
else return 1;