$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: å¼ æ²é¹ (zsp007_at_[hidden])
Date: 2006-09-30 14:49:44
It's seems faster than the algorithm now in use.
The execute file and  project file please see the attach.
DateValidate cost : 00:00:17.765546
boost_date_validate cost : 00:00:50.232232
Below is cpp source of the algorithm and test
----------------------------------------------------------------------------------------
#include <boost/lexical_cast.hpp>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost;
using namespace boost::posix_time;
using namespace boost::gregorian;
int create_date()
{
    int year=rand() %200+1900;
    int month=rand() %20;
    int day=rand() %40;
    return year*10000+month*100+day;
}
void date_validate(int date)
{
    static int daysOfMonth[] =
        {
            0,31,28,31,30,31,30,31,31,30,31,30,31
        };
    int monthDay = date % 10000;
    if (monthDay >= 1300) throw bad_month();
    if (monthDay > 1231) throw bad_day_of_month();
    if (monthDay == 229)
    {
        int year = date / 10000;
        if ( (year % 4) != 0)    throw bad_day_of_month();
        if (year %100 == 0 && year % 16 != 0)    throw bad_day_of_month();
    }
    int month = monthDay / 100;
    int day = monthDay % 100;
    if (! (day > 0 && day <= daysOfMonth[month]) ) throw bad_day_of_month();
}
bool DateValidate (string date)
{
    try
    {
       date_validate( lexical_cast<int> (date));
       return true;
    }
    catch (...)
    {
        return false;
    }
}
bool boost_date_validate (string date)
{
    try
    {
        from_undelimited_string (date);
        return true;
    }
    catch (...)
    {
        return false;
    }
}
int main()
{
    int n=1000000;
    ptime createDateBegin (microsec_clock::local_time() );
    for (int i=0;i<n;i++)
    {
        int r=create_date();
        string t=lexical_cast<string> (r);
    }
    ptime createDateEnd (microsec_clock::local_time() );
    time_duration createTime=createDateEnd-createDateBegin;
    cout<<"create_date cost : "<<createDateEnd-createDateBegin<<"\n";
    createDateBegin=microsec_clock::local_time();
    for (int i=0;i<n;i++)
    {
        int r=create_date();
        string t=lexical_cast<string> (r);
        DateValidate (t);
    }
    createDateEnd=microsec_clock::local_time();
    cout<<"DateValidate cost : 
"<<createDateEnd-createDateBegin-createTime<<"\n";
    createDateBegin=microsec_clock::local_time();
    for (int i=0;i<n;i++)
    {
        int r=create_date();
        string t=lexical_cast<string> (r);
        boost_date_validate (t);
    }
    createDateEnd=microsec_clock::local_time();
    cout<<"boost_date_validate cost : 
"<<createDateEnd-createDateBegin-createTime<<"\n";
    cin.get();
    return 0;
}