我有一个程序,要求用户输入日期,然后显示哪一个更近,我已经像这样做了
if (year1>year2 || month1>month2 || day1>day2)
return -1;
if (year1<year2 || month1<month2 || day1<day2)
return +1;
但输出不太正确。
答案 0 :(得分:8)
这是一个干净的方法:
#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;
std::tie
个对象的比较是字典式的,因此如果-1
小于date1
,则返回date2
,0
如果相同则返回1
,如果date1
大于date2
,则date
。
您最好定义自己的boost::datetime
类型(或使用struct Date
{
unsigned year;
unsigned month;
unsigned day;
};
bool operator<(const Date& lhs, const Date& rhs)
{
return std::tie(lhs.year, lhs.month, lhs.day) <
std::tie(rhs.year, rhs.month, rhs.day);
}
bool operator>(const Date& lhs, const Date& rhs) { .... }
bool operator==(const Date& lhs, const Date& rhs) { .... }
int date_cmp(const Date& lhs, const Date& rhs)
{
// use operators above to return -1, 0, 1 accordingly
}
)。
{{1}}
答案 1 :(得分:2)
你需要一个比这更复杂的检查:
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;
注意:首先返回的-1
大于第二个对我来说似乎是反直觉的,但是我已经遵循了OP提供的语义。
答案 2 :(得分:1)
本声明
if (year1>year2 || month1>month2 || day1>day2)
return -1;
测试三个条件中的任何一个是否为真。因此,如果year1高于第2年,或者month1高于month2。让我们停在那里。考虑
year1 = 2013, month1 = 12, day1 = 31;
year2 = 2014, month2 = 1, day1 = 1;
我们知道,事实上,第二年是一个更高的价值,但会发生什么
is year1 > year2? no
ok, but is month1 > month2? yes
这使得看起来第一年价值更高,但不是,它只是更高的月值。
当你进一步学习C ++时,你会发现当你达到你工作的某个点时,尝试采用一种使所有比较使用单个运算符(&lt;或&gt;)的约定是个好主意。与操作员一起了解原因。
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
答案 3 :(得分:0)
//您可以尝试
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;