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;