Hi all,

2nd week programming and face first into the wall again haha. As always I appreciate any advice or critique.

I have a small c++ program that reads through log files from a program and scans for errors. For the most part it works really well but I'm trying to add functionality and options to the program in terms of date/time selection.

essentially the date and time in the logs is presented like this:
12-Oct-2010
11-Jun-2011
14-Sep-2009

and so on. I was able to calculate the current time and my first option which is (current time - 30) days with this:

int endTime = 0;
endTime = time(NULL);
int startTime = (endTime - ((60*60*24)*30));

this gives me a number of 139128491824 blah blah so on which is fine because its constant, what I'm trying to do is convert the date structure listed above into a comparable number so I can say if

if (endTime >= start time && logTime <= endTime

thats basically the last 30 days (of course I can change it to 1 day 10 days whatever the need).

does anyone have any advice on how to do this? I've tried using swscanf() (its all utf-16 so has to be widestring). The code looks something like this

#include so on so on

int day = 0;
int year = 0;
wchar_t month [4] = {0};
wchar_t* logDate = L"12-Oct-2011";

swscanf(logDate, L"%d-%[^-]s-%d", &day, month, &year);

This almost works in that when I

wprintf ("d", day)

and so on I get the date listed in my *logDate but i'm struggling to comprehend how to make it read for any date in the "00-abc-0000" format (not to mention when i printf (%d, year) it only returns 0 >.< ).

As you can see I'm not really sure how to proceed, if I can get swscanf to read all the possible months I can just say if = oct oct=10 kind of thing and that puts it in the 00.00.0000 time format so I can get the same number.

Am I going about this the wrong way? Is there an easier way to do it? As always thanks for any advice.

Thanks for the reply :)

I had a look at the syntax for it but I can't find much information on how to feed into the conversion. If I set up like this:

time_t time;
struct tm* logTime;
int day, year = 0;
wchar_t month [4]= {0};

How do I need to go about the actual conversion of that format into the struct?

Sorry if the answer is incredibly simple, I just can't get my head around it..
Thanks :)

struct tm* logTime ; // ***

You haven't got a struct tm; all you have is a pointer.


> How do I need to go about the actual conversion of that format into the struct?

Use a look-up table, perhaps?

const wchar_t* const month_names[12] = { L"Jan", L"Feb" /* , etc */ };
int m = 0 ;
for( ; m < 12 ; ++m ) if( memcmp( month, month_names[m], sizeof(month) ) == 0 ) break ;
struct tm log_time ;
log_time.tm_mon = m ;

>>for( ; m < 12 ; ++m ) if( memcmp( month, month_names[m], sizeof(month) ) == 0 ) break ;
struct tm log_time ;

Or you could just use wcscmp() from tchar.h. sizeof(month) may or may not be the same as wcslen(month)
for( ; m < 12 ; ++m ) if( wcscmp( month, month_names[m]) == 0 ) break ;

Edited 5 Years Ago by Ancient Dragon: n/a

Why are you trying to do this using wide strings? Based on your first post it was an arbitrary decision.

This article has been dead for over six months. Start a new discussion instead.