2013-10-15 90 views
0

我目前正在製作一個C++庫,涉及從公曆日期中減去幾個月。我添加月份的作品,但我的減法公式不起作用,導致錯誤。這裏是我的減法公式代碼:如何從日期中減去幾個月並能夠處理溢出?

Gregorian operator - (Gregorian const& dt, detail::packaged_month const& month) { 
     year_t yearsToSubtract = month.nMonths_/12; 
     month_t monthsToSubtract = month.nMonths_ % 12; 
     year_t y = dt.year() - yearsToSubtract; 
     month_t m = dt.month() - monthsToSubtract; 

     int adjustment = (m - 1)/12 + (m - 12)/12; 
     y -= adjustment; 
     m += month_t(adjustment * 12); 

     day_t d = std::min(dt.day(), gregorian_days_in_month(m, is_gregorian_leapyear(y))); 

     return Gregorian(y, m, d); 
    } 

從這個結果應該是,如果我做的2001,2,1或2001年2月1日和零下4個月裏應該返回起始日期2000年10月1但我得到一個數組異常錯誤。

+1

這是學習嗎?因爲如果沒有,那裏有許多優秀的庫,例如boost date_time:http://www.boost.org/doc/libs/1_54_0/doc/html/date_time.html – namezero

+0

只需將所有日期轉換爲unix時間戳即可。做減法,然後轉換回來。手冊頁/功能可用。如果這太有限了,那麼得到一個不同的時代,並將其從幾秒鐘減少到幾天。寫功能做同樣的工作 –

+0

這是爲了學習。我知道有Boost庫,事實上我正在使用它來幫助對我的庫進行一些單元測試,並且我還試圖在文檔中查找他們如何減去幾個月的數據,但什麼都沒發現。 – Delete

回答

0

當我使用你的例子,並假設月是1-12(而不是0-11),並且所有的值都可以變成整數,我得到以下值(在代碼中聲明/修改它們的行) ):

yearsToSubtract = 0 
monthsToSubtract = 4 
y = 2001 
m = -2 

adjustment = -1 
y = 2002 
m = -14 

因此,假如我理解正確的話,你的調試器備份了我,我會在那是不是你希望它是從那裏走什麼樣的第一行開始。我預計該行要麼是第一個madjustment