2010-04-05 91 views
1

下面我有以下代碼:strftime的犯規顯示一年正確

const char* timeformat = "%Y-%m-%d %H:%M:%S"; 
const int timelength = 20; 
char timecstring[timelength]; 

strftime(timecstring, timelength, timeformat, currentstruct); 

cout << "timecstring is: " << timecstring << "\n"; 

currentstruct是TM *。 cout以正確的格式給我提供日期,但是這一年不是2010年,而是3910年。我知道從1900年開始的年度合作有些事情要做,但我不知道如何讓strftime認識到這一點,而不是將1900年的價值添加到2010年的價值中,任何人都可以提供幫助。

問候

保羅

+0

這完全取決於你如何填充電流結構。你可以發佈嗎? – Joe 2010-04-05 14:33:25

+0

C規範說tm_years是「1900年以來的年份」。爲什麼不堅持標準,並避免這一整個混亂? – Powerlord 2010-04-05 14:35:38

回答

3

當你把一年分爲您currentstruct,你顯然投入2010,但是你需要把2010-1900

如果從系統中檢索的時間和轉換爲struct tm喜歡的東西localtime,你不需要做任何減法,但因爲它是置於struct tm已經是一年 - 1900年。你需要在「手動」填寫年份時減去1900。

+0

啊,我現在明白了,我手動填充tm *結構,但是我已經習慣了爲我填充tm *結構的系統。這讓人驚歎,現在我只需在手動填充結構體時輸入110,我將得到正確的日期,爲Jerry歡呼 – paultop6 2010-04-05 14:42:47

5

一個struct tmtm_year場,顧名思義,年自1900年以來每一段代碼,涉及了struct tm預計這是這種情況的數量。你可以不設置tm_year至2010年,預計代碼神奇地確定你真正的意思是2010年而不是3910年

設置tm_year爲110,strftime會工作。

0

看起來像currentstruct->tm_year2010,這意味着在年的日期3910。爲了使正確的,所以它表示日期此年相反,你必須做一個

currentstruct->tm_year -= 1900; 

有沒有辦法告訴strftime(或其它系統功能),你的struct tm是不是真的因爲它遵循不同於系統強加的約定(例如,你想要從0開始而不是從1900開始)。