[Libreoffice-commits] .: tools/inc

Eike Rathke erack at kemper.freedesktop.org
Tue Nov 29 17:48:23 PST 2011


 tools/inc/tools/date.hxx |   33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

New commits:
commit 2b2f6abfcc83c4701b42c92c6209a1052324f0a5
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Nov 30 02:46:55 2011 +0100

    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()

diff --git a/tools/inc/tools/date.hxx b/tools/inc/tools/date.hxx
index a9d0e0d..e0cb2a2 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 );
 
 };
 


More information about the Libreoffice-commits mailing list