]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxDateTime::DiffAsDateSpan().
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 1 Oct 2012 09:55:05 +0000 (09:55 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 1 Oct 2012 09:55:05 +0000 (09:55 +0000)
This method returns the difference between the dates as wxDateSpan, unlike the
existing Subtract() and overloaded operator-() that return wxTimeSpan.

Closes #14704.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72600 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/datetime.h
interface/wx/datetime.h
src/common/datetime.cpp
tests/datetime/datetimetest.cpp
tests/testdate.h

index f6c12193c951b3f852f4704773a380369fd6667b..8bcc67f1e9645e7cbb671c5d882efaeb22a8aa2c 100644 (file)
@@ -535,6 +535,7 @@ All:
 - Fix compilation of wxHash{Map,Set} with g++ 4.7 (Nathan Ridge).
 - Fix posting large amounts of data in wxHTTP (Platonides).
 - Add wxFile::ReadAll() for consistency with wxFFile.
+- Add wxDateTime::DiffAsDateSpan() (jonasr).
 - Added Nepali translation (Him Prasad Gautam).
 
 All (GUI):
index 3420179e5a1effb2abba70547b4bf9df5c2f4342..caeae26bdac425709f7d76cbb7f231065a802a8d 100644 (file)
@@ -1063,6 +1063,8 @@ public:
     inline wxTimeSpan Subtract(const wxDateTime& dt) const;
     inline wxTimeSpan operator-(const wxDateTime& dt2) const;
 
+    wxDateSpan DiffAsDateSpan(const wxDateTime& dt) const;
+
     // conversion to/from text
     // ------------------------------------------------------------------------
 
index 0ad913cbd7ae1a5ba1973a194932551e7b5a5267..1785f392cc77a509ffc30548282c4acac94de007 100644 (file)
@@ -846,6 +846,15 @@ public:
         them as a wxTimeSpan.
     */
     wxTimeSpan Subtract(const wxDateTime& dt) const;
+    /**
+       Returns the difference between this object and @a dt as a wxDateSpan.
+
+       This method allows to find the number of entire years, months, weeks and
+       days between @a dt and this date.
+
+       @since 2.9.5
+    */
+    wxDateSpan DiffAsDateSpan(const wxDateTime& dt) const;
 
     /**
         Adds the given date span to this object.
index a2ca5d4ed8e4dc8cb545dbced056bff8af1aebb6..462347d7d654a3321d4e0a8554dc240d86251588 100644 (file)
@@ -1602,6 +1602,47 @@ wxDateTime& wxDateTime::Add(const wxDateSpan& diff)
     return *this;
 }
 
+wxDateSpan wxDateTime::DiffAsDateSpan(const wxDateTime& dt) const
+{
+    wxASSERT_MSG( IsValid() && dt.IsValid(), wxT("invalid wxDateTime"));
+
+    // If dt is larger than this, calculations below needs to be inverted.
+    int inv = 1;
+    if ( dt > *this )
+        inv = -1;
+
+    int y = GetYear() - dt.GetYear();
+
+    // If month diff is negative, dt is the year before, so decrease year
+    // and set month diff to its inverse, e.g. January - December should be 1,
+    // not -11.
+    int m = GetMonth() - dt.GetMonth();
+    if ( m * inv < 0 )
+    {
+        m += inv * MONTHS_IN_YEAR;
+        y -= inv;
+    }
+
+    // Same logic for days as for months above. Use number of days in month
+    // from the month which end date we're crossing.
+    int d = GetDay() - dt.GetDay();
+    if ( d * inv < 0 )
+    {
+        d += inv * wxDateTime::GetNumberOfDays(
+            inv > 0 ? dt.GetMonth() : GetMonth(),
+            inv > 0 ? dt.GetYear() : GetMonth());
+        m -= inv;
+    }
+
+    int w =  d / DAYS_PER_WEEK;
+
+    // Remove weeks from d, since wxDateSpan only keep days as the ones
+    // not in complete weeks
+    d -= w * DAYS_PER_WEEK;
+
+    return wxDateSpan(y, m, w, d);
+}
+
 // ----------------------------------------------------------------------------
 // Weekday and monthday stuff
 // ----------------------------------------------------------------------------
index 76f82355b4ae4f1d1f0aa2ed9b2b267b50d69e20..00a76af0ea8d09e2b76d76b6ba4a4d65ea61158e 100644 (file)
@@ -1212,6 +1212,7 @@ void DateTimeTestCase::TestTimeArithmetics()
         CPPUNIT_ASSERT_EQUAL( dt, dt1 - span );
         CPPUNIT_ASSERT_EQUAL( dt, dt2 + span );
         CPPUNIT_ASSERT_EQUAL( dt1, dt2 + 2*span );
+        CPPUNIT_ASSERT_EQUAL( span, dt1.DiffAsDateSpan(dt) );
     }
 }
 
index 5d28568da682803bb8711307dd44d1ef79980947..4a409671594a6ff771002c4b959b349a2adfcd59 100644 (file)
@@ -20,6 +20,17 @@ inline std::ostream& operator<<(std::ostream& ostr, const wxDateTime& dt)
     return ostr;
 }
 
+// need this to be able to use CPPUNIT_ASSERT_EQUAL with wxDateSpan objects
+inline std::ostream& operator<<(std::ostream& ostr, const wxDateSpan& span)
+{
+    ostr << span.GetYears() << "Y, "
+         << span.GetMonths() << "M, "
+         << span.GetWeeks() << "W, "
+         << span.GetDays() << "D";
+
+    return ostr;
+}
+
 WX_CPPUNIT_ALLOW_EQUALS_TO_INT(wxDateTime::wxDateTime_t)
 
 #endif // _WX_TESTS_TESTDATE_H_