6

C++ に比較的簡単で短い日付比較関数があるかどうか疑問に思っていました。私の日付のタイプchar*は で、次の形式になっています。DD\MM\YYYY

ありがとう。

4

4 に答える 4

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 );

を使用して秒を比較し<、どちらが早いかを判断できるようになりました。

注、std::get_timeC++11 の新機能です。これはstrptime、POSIX からのものですが、C99 標準の一部ではありません。strptimeC++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 );
}

Cで日時をUNIXタイムスタンプに変換する方法も参照してください。.

于 2012-12-09T13:41:42.967 に答える
2

これが本当に固定形式である場合は、単純な C 文字列比較で行うことができます

int date_cmp(const char *d1, const char *d2)
{
    int rc;
    // compare years
    rc = strncmp(d1 + 6, d2 + 6, 4);
    if (rc != 0)
        return rc;

    // compare months
    rc = strncmp(d1 + 3, d2 + 3, 2);
    if (rc != 0)
        return rc;

    // compare days
    return strncmp(d1, d2, 2);
}

これは のように機能しstrncmpます。d1が より前の場合は 0 未満の値を返し、d2両方が同じ日付の場合は 0 を返し、 が よりd1後の場合は 0 より大きい値を返しますd2

別のアプローチは、それをstrptimeとに変換し、これらmktimetime_tと比較することですdifftime

struct tm tm;
time_t t1, t2;
strptime(d1, "%d\\%m\\%Y", &tm);
t1 = mktime(&tm);
// do the same with d2
double diff = difftime(t1, t2);
于 2012-12-09T13:51:42.200 に答える
1

文字列から数値データを抽出する必要があります。最悪のシナリオは、一連のループと文字列から整数への変換関数です。

sscanf と sprintf を使えば簡単にできます。慣れていればprintfscanfこれは簡単に理解でき、他のケースにも簡単に適用できます。秘密の魔法の関数呼び出しはありません。

#include <stdio.h>
void main()
{
    char* date1 = "9\\12\\2012"; 
    char* date2 = "6\\11\\2013"; 

    int day1,month1,year1;
    int day2,month2,year2;

    sscanf(date1,"%d\\%d\\%d",&day1,&month1,&year1); //reads the numbers
    sscanf(date2,"%d\\%d\\%d",&day2,&month2,&year2); //from the string

    if (year1<year2 || month1<month2 || day1<day2) //compares 2 dates
    {
        printf("date1 < date2\n");
    }
    else
    {
        printf("date1 >= date2\n");
    }

    char newdate[15];

    sprintf(newdate,"%d\\%d\\%d",13,2,1998); //make a date string from numbers
    printf("%s\n",newdate);
}
于 2012-12-09T13:47:53.057 に答える