- 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):
inline wxTimeSpan Subtract(const wxDateTime& dt) const;
inline wxTimeSpan operator-(const wxDateTime& dt2) const;
+ wxDateSpan DiffAsDateSpan(const wxDateTime& dt) const;
+
// conversion to/from text
// ------------------------------------------------------------------------
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.
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
// ----------------------------------------------------------------------------
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) );
}
}
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_