比较c ++中的2个日期

Dav*_*aiz 6 c++

我想知道在C++中是否有任何相对容易和短的日期比较函数.我的日期是类型char*,并具有以下格式:DD\MM\YYYY

谢谢.

Pot*_*ter 6

解析通常在流上完成,而不是字符串,但你可以使用stringstream.

std::istringstream date_s( "04\\10\\1984" );
struct tm date_c;
date_s >> std::get_time( &date_c, "%d\\%m\\%Y" );
std::time_t seconds = std::mktime( & date_c );
Run Code Online (Sandbox Code Playgroud)

现在,您可以比较秒数,<以确定哪个更早.

注意,这std::get_time是C++ 11中的新功能.它是strptime根据POSIX 定义的,但不是C99标准的一部分.strptime如果C++ 11库不可用,则可以使用.如果你很勇敢,你也可以使用这个std::time_get方面......但它很难看.

如果您不想了解其他日期以外的日期,可以使用std::lexicographical_compare.这将是一个单行,但功能名称是如此之长.

// return true if the date string at lhs is earlier than rhs
bool date_less_ddmmyyyy( char const *lhs, char const *rhs ) {
    // compare year
    if ( std::lexicographical_compare( lhs + 6, lhs + 10, rhs + 6, rhs + 10 ) )
        return true;
    if ( ! std::equal( lhs + 6, lhs + 10, rhs + 6 ) )
        return false;
    // if years equal, compare month
    if ( std::lexicographical_compare( lhs + 3, lhs + 5, rhs + 3, rhs + 5 ) )
        return true;
    if ( ! std::equal( lhs + 3, lhs + 5, rhs + 3 ) )
        return false;
    // if months equal, compare days
    return std::lexicographical_compare( lhs, lhs + 2, rhs, rhs+2 );
}
Run Code Online (Sandbox Code Playgroud)

另请参见如何在c中将datetime转换为unix时间戳?.