Graham Graham - 1 year ago 84
C++ Question

C++ Time returned is two hours out

Bit of a c++ newbie so here we go;

I have a method that is parsing a date/time, however that date/time is passed to me always with 00:00:00 as the hh:mm:ss. As such i want to add in the values of the current systime in place of those values. I have methods that do this, and the first method is returning the correct time in UTC format.

bool CTRHTranslationRTNS::ParseDateSysTime(const char* pszString, time_t& tValue)
ASSERT(pszString != NULL);

// DateTime fields.

CStringArray astrFields;

// Split the string into the date and time fields.
int nFields = CStringParser::Split(pszString, "- :T", astrFields);

// Not DD/MM/YYYY HH:MM:SS format.
if (nFields != NUM_FIELDS)
return false;

int anFields[NUM_FIELDS] = { 0 };

// Parse field numbers.
for (int i = 0; i < NUM_FIELDS; ++i)
anFields[i] = atoi(astrFields[i]);

tm oTime = { 0 };

//Add System Time instead
time_t sysyemTimeNow;
struct tm * ptm;
time ( &sysyemTimeNow );
ptm = gmtime ( &sysyemTimeNow );

// Copy fields to time struct.
oTime.tm_mday = anFields[DAY];
oTime.tm_mon = anFields[MONTH] - 1;
oTime.tm_year = anFields[YEAR] - 1900;
oTime.tm_hour = ptm->tm_hour;
oTime.tm_min = ptm->tm_min;
oTime.tm_sec = ptm->tm_sec;
oTime.tm_isdst = -1;

// Convert to time_t.
tValue = mktime(&oTime);

// Invalid field values.
if (tValue < 0)
return false;

return true;

In the second method I do some formatting on the date/time and this results in 2 hours being removed from the time.

string CTRHTranslationRTNS::ConvertDateSysTimeToDateInUTC(const string& bossDate)
time_t dealDate;
if (ParseDateSysTime(bossDate.c_str(), dealDate))
struct tm * ptm = gmtime(&dealDate);
char buffer [80];
strftime(buffer,80,"%Y-%m-%d %H:%M:%S",ptm);
return string(buffer);
throw exception(string("Invalid date/SysTime value: ").append(bossDate).c_str());

Just to be clear, the ParseDateSysTime method returns the time with the correct UTC value of 11:53, but as soon as

struct tm * ptm = gmtime(&dealDate);

is called the time changes to 08:53. It suggests this is a product of calling the gmtime() method but i am not sure.

Many Thanks


Answer Source

The reson is the mktime() method used in the first function uses local time, but gmtime() uses UTC time.

See and for further explanation.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download