diff options
-rw-r--r-- | include/tools/date.hxx | 7 | ||||
-rw-r--r-- | sc/source/core/data/table4.cxx | 3 | ||||
-rw-r--r-- | tools/source/datetime/tdate.cxx | 29 |
3 files changed, 28 insertions, 11 deletions
diff --git a/include/tools/date.hxx b/include/tools/date.hxx index 22586c4aaf47..72351828d233 100644 --- a/include/tools/date.hxx +++ b/include/tools/date.hxx @@ -138,6 +138,13 @@ public: TOOLS_DLLPUBLIC friend Date operator -( const Date& rDate, long nDays ); TOOLS_DLLPUBLIC friend long operator -( const Date& rDate1, const Date& rDate2 ); + /** Obtain number of days in a month of a year. + + Internally sanitizes nMonth to values 1 <= nMonth <= 12, does not + normalize values. + */ + static sal_uInt16 GetDaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ); + /// Internally normalizes values. static long DateToDays( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ); /// Semantically identical to IsValidDate() member method. diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx index d63971e779df..df6f52cb502b 100644 --- a/sc/source/core/data/table4.cxx +++ b/sc/source/core/data/table4.cxx @@ -1252,8 +1252,7 @@ void ScTable::IncDate(double& rVal, sal_uInt16& nDayOfMonth, double nStep, FillD { aDate.SetMonth((sal_uInt16) nMonth); aDate.SetYear((sal_uInt16) nYear); - if ( nDayOfMonth > 28 ) - aDate.SetDay( std::min( aDate.GetDaysInMonth(), nDayOfMonth ) ); + aDate.SetDay( std::min( Date::GetDaysInMonth( nMonth, nYear), nDayOfMonth ) ); } } break; diff --git a/tools/source/datetime/tdate.cxx b/tools/source/datetime/tdate.cxx index 038a702da753..a07ee4e9ae31 100644 --- a/tools/source/datetime/tdate.cxx +++ b/tools/source/datetime/tdate.cxx @@ -44,7 +44,7 @@ inline sal_Bool ImpIsLeapYear( sal_uInt16 nYear ) } // All callers must have sanitized or normalized month and year values! -inline sal_uInt16 DaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ) +inline sal_uInt16 ImplDaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ) { if ( nMonth != 2 ) return aDaysInMonth[nMonth-1]; @@ -57,6 +57,17 @@ inline sal_uInt16 DaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ) } } +// static +sal_uInt16 Date::GetDaysInMonth( sal_uInt16 nMonth, sal_uInt16 nYear ) +{ + SAL_WARN_IF( nMonth < 1 || 12 < nMonth, "tools", "Date::GetDaysInMonth - nMonth out of bounds " << nMonth); + if (nMonth < 1) + nMonth = 1; + else if (12 < nMonth) + nMonth = 12; + return ImplDaysInMonth( nMonth, nYear); +} + long Date::DateToDays( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ) { long nDays; @@ -66,7 +77,7 @@ long Date::DateToDays( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ) nDays = ((sal_uIntPtr)nYear-1) * 365; nDays += ((nYear-1) / 4) - ((nYear-1) / 100) + ((nYear-1) / 400); for( sal_uInt16 i = 1; i < nMonth; i++ ) - nDays += DaysInMonth(i,nYear); + nDays += ImplDaysInMonth(i,nYear); nDays += nDay; return nDays; } @@ -105,9 +116,9 @@ static void DaysToDate( long nDays, while ( bCalc ); rMonth = 1; - while ( (sal_uIntPtr)nTempDays > DaysInMonth( rMonth, rYear ) ) + while ( (sal_uIntPtr)nTempDays > ImplDaysInMonth( rMonth, rYear ) ) { - nTempDays -= DaysInMonth( rMonth, rYear ); + nTempDays -= ImplDaysInMonth( rMonth, rYear ); rMonth++; } rDay = (sal_uInt16)nTempDays; @@ -179,7 +190,7 @@ sal_uInt16 Date::GetDayOfYear() const Normalize( nDay, nMonth, nYear); for( sal_uInt16 i = 1; i < nMonth; i++ ) - nDay = nDay + ::DaysInMonth( i, nYear ); // += yields a warning on MSVC, so don't use it + nDay = nDay + ::ImplDaysInMonth( i, nYear ); // += yields a warning on MSVC, so don't use it return nDay; } @@ -279,7 +290,7 @@ sal_uInt16 Date::GetDaysInMonth() const sal_uInt16 nYear = GetYear(); Normalize( nDay, nMonth, nYear); - return DaysInMonth( nMonth, nYear ); + return ImplDaysInMonth( nMonth, nYear ); } sal_Bool Date::IsLeapYear() const @@ -296,7 +307,7 @@ sal_Bool Date::IsValidAndGregorian() const if ( !nMonth || (nMonth > 12) ) return sal_False; - if ( !nDay || (nDay > DaysInMonth( nMonth, nYear )) ) + if ( !nDay || (nDay > ImplDaysInMonth( nMonth, nYear )) ) return sal_False; else if ( nYear <= 1582 ) { @@ -321,7 +332,7 @@ bool Date::IsValidDate( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ) { if ( !nMonth || (nMonth > 12) ) return false; - if ( !nDay || (nDay > DaysInMonth( nMonth, nYear )) ) + if ( !nDay || (nDay > ImplDaysInMonth( nMonth, nYear )) ) return false; return true; } @@ -371,7 +382,7 @@ bool Date::Normalize( sal_uInt16 & rDay, sal_uInt16 & rMonth, sal_uInt16 & rYear } } sal_uInt16 nDays; - while (rDay > (nDays = DaysInMonth( rMonth, rYear))) + while (rDay > (nDays = ImplDaysInMonth( rMonth, rYear))) { rDay -= nDays; if (rMonth < 12) |