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

时间:2013-12-21 09:59:02

标签: c++ c date comparison

我有一个程序,要求用户输入日期,然后显示哪一个更近,我已经像这样做了

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

if (year1<year2 || month1<month2 || day1<day2)
    return +1;

但输出不太正确。

4 个答案:

答案 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,则返回date20如果相同则返回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;