Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/3375 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/75/3375/1 fdo#40100 corect result for calc function YEARFRAC Change-Id: Ief5e5c89b7fb69fb9849cf2d6efe2b4c5b7f5391 --- M scaddins/source/analysis/analysishelper.cxx 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx index 278b26f..100b86f 100644 --- a/scaddins/source/analysis/analysishelper.cxx +++ b/scaddins/source/analysis/analysishelper.cxx @@ -366,21 +366,15 @@ nDay2, nMonth2, nYear2, nMode == 0 ) - nYears * nDaysInYear; break; case 1: // 1=exact/exact - nYears = nYear2 - nYear1; + //fdo40100 because of possible leap years calculate number + //of days separately for year1 and year2 and let nYears + //contain only number of full calendar years + nYears = nYear2 - nYear1 - 1; nDaysInYear = IsLeapYear( nYear1 )? 366 : 365; - if( nYears && ( nMonth1 > nMonth2 || ( nMonth1 == nMonth2 && nDay1 > nDay2 ) ) ) - nYears--; - - if( nYears ) - nDayDiff = nDate2 - DateToDays( nDay1, nMonth1, nYear2 ); - else - nDayDiff = nDate2 - nDate1; - - if( nDayDiff < 0 ) - nDayDiff += nDaysInYear; - + nDayDiff = ( nDate2 - DateToDays( 1, 1, nYear2 ) ) + + ( DateToDays( 31, 12, nYear1 ) - nDate1 ) + 1; //plus 1 for Dec 31 to Jan 1 break; case 2: // 2=exact/360 nDaysInYear = 360; @@ -508,6 +502,18 @@ } +//TODO: In the case of nMode == 1 (exact), there still remains a small error +// in the result because of leap years. nDaysInYear is an integer and +// returns the days in the year of nStartDate. If nEndDate is not a +// leap year, the year fraction of the days in the year of nEndDate is +// a little bit too small. If nStardate is not in a leap year, but +// nEndDate is, then year fraction of the days in the year of nEndDate +// is a little bit too large. +// This could be corrected when nDaysInYear is a float and the value +// reflects the number of days in the leap year and the non-leap year. +// Example: If there are 80 days in the leap year and 80 days in the +// non-leap year, then nDaysInYear would be 365.5, resulting in a more +// or less exact year fraction. double GetYearFrac( sal_Int32 nNullDate, sal_Int32 nStartDate, sal_Int32 nEndDate, sal_Int32 nMode ) throw( uno::RuntimeException, lang::IllegalArgumentException ) { if( nStartDate == nEndDate ) @@ -517,7 +523,6 @@ sal_Int32 nDayDiff, nDaysInYear; GetDiffParam( nNullDate, nStartDate, nEndDate, nMode, nYears, nDayDiff, nDaysInYear ); - return double( nYears ) + double( nDayDiff ) / double( nDaysInYear ); } -- To view, visit https://gerrit.libreoffice.org/3375 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ief5e5c89b7fb69fb9849cf2d6efe2b4c5b7f5391 Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: master Gerrit-Owner: Winfried Donkers <o...@dci-electronics.nl> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice