2011-06-28 66 views
1

到類似:歷史時間GMT UTC與DST

Convert historical time to GMT

這一次我的情況是: 我需要一些字符串時間轉換格式爲「2011061411322100」爲GMT。問題是時代來自另一臺個人電腦,並且是一個歷史時期。所以我沒有實時獲得時間,所以我不能簡單地從我的代碼運行的盒子上的當地時間獲取GMT。

時間代表開始和結束時間。如果我的代碼在時間更改期間運行,則時間更改將適用於我獲得時間的遠程框。所以如果在開始和結束時間之間發生變化,那麼結束時間將被抵消。

我想我必須先轉換成TM:

// add to tm struct 
tm tmTime; 
tmTime.tm_hour = hour; 
tmTime.tm_min = min; 
tmTime.tm_sec = sec; 
tmTime.tm_mday = day; 
tmTime.tm_mon = (month-1); 
tmTime.tm_year = (year - 1900); 

然後轉換爲time_t的

time_t tmInTime_t = mktime(&tmTime); 

然後使用gmtime的:

struct tm *gmt = gmtime(&tmInTime_t); 

這仍然會導致較大的增量,如果時間變化發生在開始和結束之間。我該如何解決? 我需要設置.tm_isdst嗎?我如何知道要設置什麼?

+2

看着你的另一個問題我有點困惑:是2011061411322100 GMT/UTC或當地時間?另一臺個人電腦總是和主機一樣處於同一時區嗎?您希望輸出的格式是什麼? - 具有GMT/UTC值的結構tm? –

+2

tz數據庫http://en.wikipedia.org/wiki/Tz_database有關於歷史時區的信息;但只有當你知道時區並且你知道另一臺PC正在遵守規則時纔有用。 –

+1

可以在C++系統中使用嗎? –

回答

1

絕對必須知道什麼參考時區是源數據。簡單地說它是源機器上的本地時間,並不能提供足夠的信息。 請考慮(例如,很多情況下):2007年美國的DST規則發生了變化,跨越該範圍的任何日期計算必須考慮到這一點。當你開始處理政治邊界的時區時,情況會變得更加複雜。

http://www.boost.org/doc/libs/1_47_0/doc/html/date_time.html 是用C++編寫的健壯時間/日期庫的一個例子,它可以在大多數平臺上使用。它將允許您在日期和時間上執行各種「算術」操作。它還包含對TZ數據庫的支持,它將允許您在跨越時區規則更改的日期時間執行操作。