2011-07-14 47 views
0

更新:故事的寓意是信任直覺,而不是去尋找問題。最終,用戶報告的問題處於完全不同的領域,Jon強調我們在測試中引入了一個錯誤,我們錯過了該錯誤,因爲結果似乎驗證了正在尋找的內容。確定一個日曆年(有/無閏年)

原題:

在許多應用中有顯示的開始/結束日期,在結束日期包含一個日曆年的要求。因此,如果開始日期是2012年1月1日,結束日期是12月31日2012年基本規則是增加了一年,休息一天 - 因爲你是一個擴展方法:

public static DateTime CalendarYear(this DateTime dateTime) 
    { 
     return dateTime.AddYears(1).AddDays(-1); 
    } 

然而,上面的代碼不能應付閏年!我們的單元測試標記了365個OCCURENCES其中來自1日開始日期2011年1月至直通12月31日2014年定義錯誤邊界的日期進行測試時,在預產期日期不匹配所確定的結束日期是:

  • 開始日期:2011年3月1日,預計結束日期:2012年2月28日:實際結束 日期:2012年2月29日
  • 開始日期:2012年2月28日,預計結束日期:02月26日 2013:實際結束日期:2013年2月27日

2011年3月1日之前的日期表現如預期,2012年2月28日之後的日期表現如預期。

我知道測試失敗的原因是因爲開始/結束日期包含2月29日閏年事件,但任何人都有一個簡單可靠的建議(應對閏年事件)來取代基本「AddYears(1).AddDays(-1)」可以快速確定日曆年?

+0

如何使用DateTime.IsLeapYear方法? – eugeneK

回答

4

它看起來像我的「實際」版本是正確的......你爲什麼會期望「一年減一天」從2月28日到2月26日?你怎麼能說它包含一個日曆年,如果2月27日不包括在任何地方?

如果你真的想要這些值,你有沒有考慮只是調用AddDays(364)而已?

+0

嗯,你說得對。我們首先調查了一個報告的bug,並且一直在修改我們的測試以嘗試將其鎖定。我們似乎已經在這個過程中失去了一點「測試結果」。我會再看一看,並相應地更新問題。 –

0

我必須錯過一些真正明顯的東西,就好像我放在2011年3月1日,並做addyear-1day,我得到我作爲人類會期望2012年二月二十九日,如果我做2012年二月28日addyear-1day我得到2013年2月27日..如果你只想添加365天,那就這樣做。我有點困惑。所以你的實際結果看起來是對的。

需要更多咖啡?

+0

這絕對是這樣看的,我很驚訝這個擴展方法並沒有像我之前使用過的那樣工作,而且很確定它沒問題。試圖弄清楚發生了什麼,並相應更新問題。 –