views:

541

answers:

3

I'm trying to convert the string produced from the __DATE__ macro into a time_t. I don't need a full-blown date/time parser, something that only handles the format of the __DATE__ macro would be great.

A preprocessor method would be nifty, but a function would work just as well. If it's relevant, I'm using MSVC.

+3  A: 

Edit: the corrected function should look something like this:

time_t cvt_TIME(char const *time) { 
    char s_month[5];
    int month, day, year;
    struct tm t = {0};
    static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";

    sscanf(time, "%s %d %d", s_month, &day, &year);

    month = (strstr(mon_name, month_names)-month_names)/3;

    t.tm_mon = month-1;
    t.tm_mday = day;
    t.tm_year = year - 1900;
    t.tm_isdst = -1;

    return mktime(&t);
}
Jerry Coffin
One big thing - the month 'returned' by `__DATE__` is in name form ('Jan', 'Feb' etc). Another minor suggestion: you should set `t.tm_dst = -1` so `mktime()` will attempt to use the appropriate DST.
Michael Burr
@Michael - it looks like t.tm_dst is not part of visual c++.
tfinniga
I'm sorry - that should have been `t.tm_isdst = -1`
Michael Burr
A: 

Jerry's function looks great. Here's my attempt.. I threw in the __TIME__ as well.

time_t time_when_compiled()
{
    string datestr = __DATE__;
    string timestr = __TIME__;

    istringstream iss_date( datestr );
    string str_month;
    int day;
    int year;
    iss_date >> str_month >> day >> year;

    int month;
    if     ( str_month == "Jan" ) month = 1;
    else if( str_month == "Feb" ) month = 2;
    else if( str_month == "Mar" ) month = 3;
    else if( str_month == "Apr" ) month = 4;
    else if( str_month == "May" ) month = 5;
    else if( str_month == "Jun" ) month = 6;
    else if( str_month == "Jul" ) month = 7;
    else if( str_month == "Aug" ) month = 8;
    else if( str_month == "Sep" ) month = 9;
    else if( str_month == "Oct" ) month = 10;
    else if( str_month == "Nov" ) month = 11;
    else if( str_month == "Dec" ) month = 12;
    else exit(-1);

    for( string::size_type pos = timestr.find( ':' ); pos != string::npos; pos = timestr.find( ':', pos ) )
     timestr[ pos ] = ' ';
    istringstream iss_time( timestr );
    int hour, min, sec;
    iss_time >> hour >> min >> sec;

    tm t = {0};
    t.tm_mon = month-1;
    t.tm_mday = day;
    t.tm_year = year - 1900;
    t.tm_hour = hour;
    t.tm_min = min;
    t.tm_sec = sec;
    return mktime(&t);
}

int main( int, char** )
{
    cout << "Time_t when compiled: " << time_when_compiled() << endl;
    cout << "Time_t now: " << time(0) << endl;

    return 0;
}
tfinniga
+1  A: 

Answer here.

Spec for the format of DATE is here.

user9876