2014-02-10 256 views
3

至於一些網站,這些轉換UNIX時間戳說的轉換日期在C++ UNIX時間戳

2013/05/07 05:01:00 (yyyy/mm/dd, hh:mm:ss) is 1367902860. 

郵票我做它在C++的方式,郵票不同於日期。 下面是代碼:

time_t rawtime; 
struct tm * timeinfo; 

int year=2013, month=5, day=7, hour = 5, min = 1, sec = 0; 

/* get current timeinfo: */ 
time (&rawtime); //or: rawtime = time(0); 
/* convert to struct: */ 
timeinfo = localtime (&rawtime); 

/* now modify the timeinfo to the given date: */ 
timeinfo->tm_year = year - 1900; 
timeinfo->tm_mon = month - 1; //months since January - [0,11] 
timeinfo->tm_mday = day;   //day of the month - [1,31] 
timeinfo->tm_hour = hour;   //hours since midnight - [0,23] 
timeinfo->tm_min = min;   //minutes after the hour - [0,59] 
timeinfo->tm_sec = sec;   //seconds after the minute - [0,59] 

/* call mktime: create unix time stamp from timeinfo struct */ 
date = mktime (timeinfo); 

printf ("Until the given date, since 1970/01/01 %i seconds have passed.\n", date); 

產生的時間戳是

1367899260, but not 1367902860. 

有什麼問題嗎?即使我改變爲小時-1或小時+1,它也不匹配。編輯:好的,如果我加1到小時,它的作品。以前也加1分鐘。

回答

0

mktime()本地日曆時間轉換爲紀元以來的time_t對象的時間,所以如果你是在不同的時區的結果將是從網站的不同。該網站以2013/05/07 05:01:00作爲UTC時間。我的機器上的相同代碼的結果爲1367874060,它距離網站的價值8小時。我在UTC + 8:00時區,因此我的機器上的mktime()將輸入2013/05/07 05:01:00用作UTC + 8:00時間,因此導致差異。

PS:localtime()返回一個指向一個靜態內部對象struct tm的指針。該結構可以在gmtime(),localtime()ctime()之間共享,並且可以在每次調用時被覆蓋。所以最好有自己的本地副本struct tm對象。

0

不要使用指向localtime的指針。保存實際值

struct tm timeinfo; 
... 
timeinfo = *localtime(&rawtime); 
... 
date = mktime(&timeinfo); 

您不知道還有什麼可以使用localtime返回的指針。 mktime可能會使用它。

+0

不錯的想法,但它不會改變任何東西。 – user2366975

0

它看起來像網站假設時間在UTC時區,並且您的計算機設置爲其他時區。

您可以撥打gmtime而不是localtime來使用UTC;但我剛剛注意到您實際上並未使用localtime來執行任何操作,除非獲得指向tm的指針。你最好宣佈本地tm;當調用另一個時間庫函數時,localtime使用的那個可以被重用。

不幸的是,沒有使用UTC的mktime的標準變體。如果你想要UTC,你的選擇是:

  • 使用setenv("TZ", "", 1);設置時區。請注意,這會影響整個程序,因此如果您還需要處理當地時間,可能會很尷尬。
  • 使用像Boost.DateTime這樣的庫,在處理日期和時區上比C庫稍好。
+0

我已經更改爲'timeinfo = gmtime(&rawtime);'並且結果保持不變。 – user2366975

+0

@ user2366975:哦,是的,'mktime'仍然會假設當地時間,並且沒有UTC版本。 –

1

您是否有夏令時? tm :: tm_isdst參數是夏令時的標誌。當地時間呼叫會根據您的位置和一年的時間填寫,而您不會重置。因此,即使您和網頁同時使用,如果您設置了夏令時標誌並且網頁沒有,那麼您最終會在1小時內結束。

請注意,您並不需要localtime調用。您可以手動填寫所有部分,因爲tm :: tm_wday和tm :: tm_yday會被mktime忽略。退房http://www.cplusplus.com/reference/ctime/tm/http://www.cplusplus.com/reference/ctime/mktime/