tags:

views:

109

answers:

1

Please see the code below:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main(void)
{
      time_t current_time = 1270715952;
      cout << "Subscriber current timestamp:" << current_time << endl;
      tm* currentTm = localtime(&current_time);
      char tmp_str[256];
      //2010-04-08T11:39:12
      snprintf(tmp_str,
         sizeof(tmp_str),
         "%04d%02d%02d%02d%02d%02d.000",
         currentTm->tm_year+1900,
         currentTm->tm_mon+1,
         currentTm->tm_mday,
         currentTm->tm_hour,
         currentTm->tm_min,
         currentTm->tm_sec);
      cout << "Subscriber current date:" << tmp_str << endl;
      tm tmpDateScheduleFrom, tmpDateScheduleTo;
      memset(&tmpDateScheduleFrom, 0, sizeof(tm));
      memset(&tmpDateScheduleTo, 0, sizeof(tm));
      //2010-04-08T11:00
      tmpDateScheduleFrom.tm_sec  = 0;
      tmpDateScheduleFrom.tm_min  = 0;
      tmpDateScheduleFrom.tm_hour = 11;
      tmpDateScheduleFrom.tm_mday = 8;
      tmpDateScheduleFrom.tm_mon  = 3;
      tmpDateScheduleFrom.tm_year = 110;
      //2010-04-08T12:00
      tmpDateScheduleTo.tm_sec  = 0;
      tmpDateScheduleTo.tm_min  = 0;
      tmpDateScheduleTo.tm_hour = 12;
      tmpDateScheduleTo.tm_mday = 8;
      tmpDateScheduleTo.tm_mon  = 3;
      tmpDateScheduleTo.tm_year = 110;
      time_t localFrom   = mktime(&tmpDateScheduleFrom);
      time_t localTo     = mktime(&tmpDateScheduleTo);
      cout << "Subscriber current timestamp:" << current_time << endl;
      cout << "Subscriber localFrom:" << localFrom << endl;
      cout << "Subscriber localTo:" << localTo << endl;
      return 0;
}

The results are the following:

Subscriber current timestamp:1270715952
Subscriber current date:20100408113912.000
Subscriber current timestamp:1270715952
Subscriber localFrom:1270717200
Subscriber localTo:1270720800

Why the current subscriber timestamp (subscriber date and time: 2010-04-08T11:39:12) is not between the range localFrom (timestamp of date/time: 2010-04-08T11:00:00) and LocalTo (timestamp of date/time: 2010-04-08T12:00:00)?

A: 

I think the problem is that you set tm_isdst to 0, which means no DST, however localtime() uses system-wide DST settings.

If you set tm_isdst to 1, everything should be ok. According to man mktime, you can set negative value for tm_isdst if you are not sure about it. man doesn't say it explicitly but I guess in this case mktime() will use system settings as well, just like localtime().

qrdl
If you set `tm_isdst` to 1, it'll be fine until DST changes again and then break in the opposite direction. As you indicated, use -1 to have the system compute the appropriate value for isdst automatically.
Mark B