2010-04-08 4 views
0

S'il vous plaît voir le code ci-dessous:question Timestamp avec localtime et mktime

#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; 
} 

Les résultats sont les suivants:

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

Pourquoi l'horodatage d'abonné actuel (date de l'abonné et le temps: 2010-04- 08T11: 39: 12) n'est pas compris entre la plage localFrom (date et heure: 2010-04-08T11: 00: 00) et LocalTo (date et heure: 2010-04-08T12: 00: 00)?

Répondre

1

Je pense que le problème est que vous définissez tm_isdst-0, ce qui signifie no DST, mais localtime() utilise les paramètres de l'heure d'été à l'échelle du système.

Si vous définissez tm_isdst à 1, tout devrait bien se passer. Selon man mktime, vous pouvez définir une valeur négative pour tm_isdst si vous n'êtes pas sûr à ce sujet. man ne le dit pas explicitement, mais je suppose que dans ce cas mktime() utilisera également les paramètres du système, tout comme localtime().

+1

Si vous définissez 'tm_isdst' sur 1, tout ira bien jusqu'à ce que l'heure d'été change à nouveau, puis qu'elle se brise dans la direction opposée. Comme vous l'avez indiqué, utilisez -1 pour que le système calcule automatiquement la valeur appropriée pour isdst. –