2010-04-08 343 views
0

請參閱下面的代碼:時間戳問題

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

結果如下:

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

爲什麼當前用戶時間戳(訂戶的日期和時間:2010-04- 08T11:39:12)不在localFrom(日期/時間:2010-04-08T11:00:00的時間戳)和LocalTo(日期/時間:2010-04-08T12:00:00的時間戳)之間。

回答

1

我認爲這個問題是你設置tm_isdst0,這意味着no DST,但是localtime()使用系統範圍的DST設置。

如果你設置tm_isdst1,一切都應該沒問題。根據man mktime,如果您對此不確定,則可以爲tm_isdst設置負值。 man沒有明確說明,但我想在這種情況下,mktime()也會使用系統設置,就像localtime()一樣。

+1

如果將'tm_isdst'設置爲1,則它會很好,直到DST再次發生變化,然後在相反的方向中斷。如您所示,使用-1來讓系統自動計算isdst的適當值。 – 2010-04-08 15:22:06