2012-11-20 76 views
3

我有一個C++代碼,我可以通過它來計算/操作從輸入excel日期開始(通過操縱我的意思是我可以通過特定增量增加/減少輸入日期或做其他計算)。C++ time_t在1/1/1970之前返回

我在我的代碼中使用變量time_t。根據msdn文檔time_t計算自1970年1月1日以來經過的秒數。所以給定一個輸入日期,我首先計算自01/01/1970以來的elasped秒數,將其存儲在time_t中,然後使用localtime()進行所有其他計算。

我的代碼正常工作,因爲我的輸入日期超過了01/01/1970,但是在此之前的日期分解了。

問題:有沒有其他變量或結構可以在01/01/1970之前使用。或者有沒有辦法在01/01/1970之前操作time_t變量。

在此先感謝

我從02/01/1970開始。我想通過2.降低月第一我使用

void localtime(int* py = 0, int* pm = 0, int* pd = 0, 
      int* ph = 0, int* pn = 0, int* ps = 0, 
      int* pwday = 0, int* pyday = 0, int* pisdst = 0) const 
{ 
    struct tm* ptm = ::localtime(&t_); 
    if (py) *py = ptm->tm_year + 1900; 
    if (pm) *pm = ptm->tm_mon + 1; 
    if (pd) *pd = ptm->tm_mday; 
    if (ph) *ph = ptm->tm_hour; 
    if (pn) *pn = ptm->tm_min; 
    if (ps) *ps = ptm->tm_sec; 
    if (pwday) *pwday = ptm->tm_wday; 
    if (pyday) *pyday = ptm->tm_yday; 
    if (pisdst) *pisdst = ptm->tm_isdst; 
} 

然後我使用:MAKETIME(Y,M +計數,d,H,N,S);其中y = 1970,M = 2,計數= -2,d = 1(從上面的代碼的輸出處的MAKETIME()如下:。

void maketime(int y, int m, int d, int h = 0, int n = 0, int s = 0) 
{ 
    struct tm t; 
    t.tm_year = y - 1900; 
    t.tm_mon = m - 1; 
    t.tm_mday = d; 
    t.tm_hour = h; 
    t.tm_min = n; 
    t.tm_sec = s; 
    t.tm_isdst = -1; 

    t_ = ::mktime(&t); 
} 

這導致T_ = -1

現在

該結果我調用本地時間()一次

 struct tm* ptm = ::localtime(&t_); 

內本地時間的第一行()失敗時T_ = -1。

+0

你知道,如果一天超過天的一個月的數量會發生什麼事,例如有沒有辦法在01/01/1970之前操作time_t變量,因爲文檔告訴你。 –

+0

'time_t'是一個有符號值,所以我不明白你有什麼問題。你可以說得更詳細點嗎? –

+0

嗨馬克我已更新我的帖子與我正在使用的代碼。並描述我失敗的地方。 – user1612986

回答

3

FILETIME類似地基於一個整數計數,100-納秒間隔的情況下,它一路回到1601.

看到你的編輯後,問題看起來很簡單:你需要確保tm struct的所有元素都在界限內。當您添加或減去幾個月時,您需要調整,直到月份編號介於0和11之間。無論您使用time_t還是FILETIME,都是如此。

while (m < 0) 
{ 
    m += 12; 
    y -= 1; 
} 
while (m > 11) 
{ 
    m -= 12; 
    y += 1; 
} 

我不知道,如果你嘗試爲1個月,從3月31日減去