summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tools/date.hxx7
-rw-r--r--sc/source/core/data/table4.cxx3
-rw-r--r--tools/source/datetime/tdate.cxx29
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)