diff options
author | Eike Rathke <erack@redhat.com> | 2011-11-30 02:46:55 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2011-11-30 02:46:55 +0100 |
commit | 2b2f6abfcc83c4701b42c92c6209a1052324f0a5 (patch) | |
tree | 2b0a9fc9bb7872dae5e96fcbceebfeb24bb6f25a /tools | |
parent | 7613359985a89a42417a746bcdbb25f072784733 (diff) |
introduced Date::IsValidDate() and Date::Normalize()
+ IsValidDate() checks only day and month regarding the year, not Gregorian
cut-off date as now does IsValidAndGregorian().
+ Normalize() carries over invalid day and month values to next months and
years.
* All methods that return or internally use a day count now internally
normalize the date values, without modifying the actual Date instance. So,
if the date is not valid you may get unexpected results.
* Previously, a date with month>12 would had accessed the days-of-month
array out of bounds on all such methods. So you would had gotten
unexpected results anyway..
* Affected methods are:
GetDayOfYear()
GetWeekOfYear()
GetDaysInMonth()
static DateToDays()
Diffstat (limited to 'tools')
-rw-r--r-- | tools/inc/tools/date.hxx | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/tools/inc/tools/date.hxx b/tools/inc/tools/date.hxx index a9d0e0d53848..e0cb2a25ff39 100644 --- a/tools/inc/tools/date.hxx +++ b/tools/inc/tools/date.hxx @@ -70,22 +70,48 @@ public: sal_uInt16 GetMonth() const { return (sal_uInt16)((nDate / 100) % 100); } sal_uInt16 GetYear() const { return (sal_uInt16)(nDate / 10000); } + /// Internally normalizes a copy of values. DayOfWeek GetDayOfWeek() const; + + /// Internally normalizes a copy of values. sal_uInt16 GetDayOfYear() const; + /** nMinimumNumberOfDaysInWeek: how many days of a week must reside in the - first week of a year. */ + first week of a year. + Internally normalizes a copy of values. */ sal_uInt16 GetWeekOfYear( DayOfWeek eStartDay = MONDAY, sal_Int16 nMinimumNumberOfDaysInWeek = 4 ) const; + /// Internally normalizes a copy of values. sal_uInt16 GetDaysInMonth() const; + sal_uInt16 GetDaysInYear() const { return (IsLeapYear()) ? 366 : 365; } sal_Bool IsLeapYear() const; + /** If the represented date is valid (1<=month<=12, 1<=day<=(28,29,30,31) depending on month/year) AND is of the Gregorian calendar (1582-10-15 <= date) (AND implicitly date <= 9999-12-31 due to internal representation) */ sal_Bool IsValidAndGregorian() const; + /** If the represented date is valid (1<=month<=12, 1<=day<=(28,29,30,31) + depending on month/year) */ + bool IsValidDate() const; + + /** Normalize date, invalid day or month values are adapted such that they + carry over to the next month or/and year, for example 1999-02-32 + becomes 1999-03-04, 1999-13-01 becomes 2000-01-01, 1999-13-42 becomes + 2000-02-11. Truncates at 9999-12-31, 0000-00-x will yield the + normalized value of 0000-01-max(1,(x-31)) + + This may be necessary after Date ctors or if the SetDate(), SetDay(), + SetMonth(), SetYear() methods set individual non-matching values. + Adding/subtracting to/from dates never produces invalid dates. + + @returns TRUE if the date was normalized, i.e. not valid before. + */ + bool Normalize(); + sal_Bool IsBetween( const Date& rFrom, const Date& rTo ) const { return ((nDate >= rFrom.nDate) && (nDate <= rTo.nDate)); } @@ -118,7 +144,12 @@ public: TOOLS_DLLPUBLIC friend Date operator -( const Date& rDate, long nDays ); TOOLS_DLLPUBLIC friend long operator -( const Date& rDate1, const Date& rDate2 ); + /// Internally normalizes values. static long DateToDays( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ); + /// Semantically identical to IsValidDate() member method. + static bool IsValidDate( sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear ); + /// Semantically identical to Normalize() member method. + static bool Normalize( sal_uInt16 & rDay, sal_uInt16 & rMonth, sal_uInt16 & rYear ); }; |