]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/datetime.h
Provide NSAutoreleasePool instances during initialization
[wxWidgets.git] / include / wx / datetime.h
index d1ded5d9a4c934095f3d77e153bf922cf860849e..059ad5316da618e125a0646c0068a2d29c39030a 100644 (file)
@@ -7,35 +7,56 @@
 // Created:     10.02.99
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_DATETIME_H
 #define _WX_DATETIME_H
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(__APPLE__)
     #pragma interface "datetime.h"
 #endif
 
+#include "wx/defs.h"
+
+#if wxUSE_DATETIME
+
 #include <time.h>
 #include <limits.h>             // for INT_MIN
 
 #include "wx/longlong.h"
 
-class WXDLLEXPORT wxDateTime;
-class WXDLLEXPORT wxTimeSpan;
-class WXDLLEXPORT wxDateSpan;
+class WXDLLIMPEXP_BASE wxDateTime;
+class WXDLLIMPEXP_BASE wxTimeSpan;
+class WXDLLIMPEXP_BASE wxDateSpan;
 
-// don't use inline functions in debug builds - we don't care about
+// a hack: don't use inline functions in debug builds - we don't care about
 // performances and this only leads to increased rebuild time (because every
 // time an inline method is changed, all files including the header must be
 // rebuilt)
-#ifdef __WXDEBUG__
+
+// For Mingw32, causes a link error. (VZ: why?)
+#if defined( __WXDEBUG__) && !defined(__MINGW32__) && !(defined(_MSC_VER) && wxUSE_ACCESSIBILITY)
+    #define wxDATETIME_DONT_INLINE
+
+    #undef inline
     #define inline
+#else
+    // just in case
+    #undef wxDATETIME_DONT_INLINE
 #endif // Debug
 
+// not all c-runtimes are based on 1/1/1970 being (time_t) 0
+// set this to the corresponding value in seconds 1/1/1970 has on your
+// systems c-runtime
+
+#if defined(__WXMAC__) && !defined(__DARWIN__) && __MSL__ < 0x6000
+    #define WX_TIME_BASE_OFFSET ( 2082844800L + 126144000L )
+#else
+    #define WX_TIME_BASE_OFFSET 0
+#endif
 /*
- * TODO Well, everything :-)
+ * TODO
  *
  * + 1. Time zones with minutes (make TimeZone a class)
  * ? 2. getdate() function like under Solaris
@@ -63,7 +84,7 @@ class WXDLLEXPORT wxDateSpan;
   wxTimeSpan + wxTimeSpan = wxTimeSpan
   wxDateSpan + wxDateSpan = wxDateSpan
 
-  substraction
+  subtraction
   ------------
   wxDateTime - wxDateTime = wxTimeSpan
   wxDateTime - wxTimeSpan = wxDateTime
@@ -84,7 +105,7 @@ class WXDLLEXPORT wxDateSpan;
   -wxDateSpan = wxDateSpan
 
   For each binary operation OP (+, -, *) we have the following operatorOP=() as
-  a method and the method with a symbolic name OPER (Add, Substract, Multiply)
+  a method and the method with a symbolic name OPER (Add, Subtract, Multiply)
   as a synonym for it and another const method with the same name which returns
   the changed copy of the object and operatorOP() as a global function which is
   implemented in terms of the const version of OPEN. For the unary - we have
@@ -96,16 +117,16 @@ class WXDLLEXPORT wxDateSpan;
 // argument for arguments of type wxDateTime; it is also returned by all
 // functions returning wxDateTime on failure (this is why it is also called
 // wxInvalidDateTime)
-class WXDLLEXPORT wxDateTime;
+class WXDLLIMPEXP_BASE wxDateTime;
 
-WXDLLEXPORT_DATA(extern wxDateTime&) wxDefaultDateTime;
+extern WXDLLIMPEXP_DATA_BASE(const wxDateTime) wxDefaultDateTime;
 #define wxInvalidDateTime wxDefaultDateTime
 
 // ----------------------------------------------------------------------------
 // wxDateTime represents an absolute moment in the time
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxDateTime
+class WXDLLIMPEXP_BASE wxDateTime
 {
 public:
     // types
@@ -377,7 +398,7 @@ public:
 
         // a class representing a time zone: basicly, this is just an offset
         // (in seconds) from GMT
-    class WXDLLEXPORT TimeZone
+    class WXDLLIMPEXP_BASE TimeZone
     {
     public:
         TimeZone(TZ tz);
@@ -397,7 +418,7 @@ public:
         // NB: this struct should always be kept normalized (i.e. mon should
         //     be < 12, 1 <= day <= 31 &c), so use AddMonths(), AddDays()
         //     instead of modifying the member fields directly!
-    struct WXDLLEXPORT Tm
+    struct WXDLLIMPEXP_BASE Tm
     {
         wxDateTime_t msec, sec, min, hour, mday;
         Month mon;
@@ -510,6 +531,10 @@ public:
         // return the wxDateTime object for the current time
     static inline wxDateTime Now();
 
+        // return the wxDateTime object for the current time with millisecond
+        // precision (if available on this platform)
+    static wxDateTime UNow();
+
         // return the wxDateTime object for today midnight: i.e. as Now() but
         // with time set to 0
     static inline wxDateTime Today();
@@ -520,7 +545,7 @@ public:
     // ------------------------------------------------------------------------
 
         // default ctor does not initialize the object, use Set()!
-    wxDateTime() { }
+    wxDateTime() { m_time = wxLongLong((long)ULONG_MAX, ULONG_MAX); }
 
         // from time_t: seconds since the Epoch 00:00:00 UTC, Jan 1, 1970)
 #if (!(defined(__VISAGECPP__) && __IBMCPP__ >= 400))
@@ -542,7 +567,7 @@ public:
                       wxDateTime_t millisec = 0);
         // from separate values for each component with explicit date
     inline wxDateTime(wxDateTime_t day,             // day of the month
-                      Month        month = Inv_Month,
+                      Month        month,
                       int          year = Inv_Year, // 1999, not 99 please!
                       wxDateTime_t hour = 0,
                       wxDateTime_t minute = 0,
@@ -585,7 +610,7 @@ public:
         // from separate values for each component with explicit date
         // (defaults for month and year are the current values)
     wxDateTime& Set(wxDateTime_t day,
-                    Month        month = Inv_Month,
+                    Month        month,
                     int          year = Inv_Year, // 1999, not 99 please!
                     wxDateTime_t hour = 0,
                     wxDateTime_t minute = 0,
@@ -630,8 +655,10 @@ public:
     // ------------------------------------------------------------------------
 
         // set to the given week day in the same week as this one
-    wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday);
-    inline wxDateTime GetWeekDayInSameWeek(WeekDay weekday) const;
+    wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday,
+                                       WeekFlags flags = Monday_First);
+    inline wxDateTime GetWeekDayInSameWeek(WeekDay weekday,
+                                           WeekFlags flags = Monday_First) const;
 
         // set to the next week day following this one
     wxDateTime& SetToNextWeekDay(WeekDay weekday);
@@ -665,8 +692,12 @@ public:
         // sets the date to the given day of the given week in the year,
         // returns TRUE on success and FALSE if given date doesn't exist (e.g.
         // numWeek is > 53)
-    bool SetToTheWeek(wxDateTime_t numWeek, WeekDay weekday = Mon);
-    inline wxDateTime GetWeek(wxDateTime_t numWeek, WeekDay weekday = Mon) const;
+    bool SetToTheWeek(wxDateTime_t numWeek,
+                      WeekDay weekday = Mon,
+                      WeekFlags flags = Monday_First);
+    inline wxDateTime GetWeek(wxDateTime_t numWeek,
+                              WeekDay weekday = Mon,
+                              WeekFlags flags = Monday_First) const;
 
         // sets the date to the last day of the given (or current) month or the
         // given (or current) year
@@ -754,8 +785,8 @@ public:
     // result of timezone shift)
     // ------------------------------------------------------------------------
 
-        // is the date valid (TRUE even for non initialized objects)?
-    inline bool IsValid() const { return this != &wxInvalidDateTime; }
+        // is the date valid?
+    inline bool IsValid() const { return m_time != wxInvalidDateTime.m_time; }
 
         // get the broken down date/time representation in the given timezone
         //
@@ -816,6 +847,15 @@ public:
         //     adoption of the Gregorian calendar is simply unknown.
     bool IsGregorianDate(GregorianAdoption country = Gr_Standard) const;
 
+    // dos date and time format
+    // ------------------------------------------------------------------------
+
+        // set from the DOS packed format
+    wxDateTime& SetFromDOS(unsigned long ddt);
+
+        // pack the date in DOS format
+    unsigned long GetAsDOS() const;
+
     // comparison (see also functions below for operator versions)
     // ------------------------------------------------------------------------
 
@@ -855,10 +895,10 @@ public:
     inline wxDateTime& operator+=(const wxTimeSpan& diff);
 
         // return the difference of the date with a time span
-    inline wxDateTime Substract(const wxTimeSpan& diff) const;
-        // substract a time span (positive or negative)
-    inline wxDateTime& Substract(const wxTimeSpan& diff);
-        // substract a time span (positive or negative)
+    inline wxDateTime Subtract(const wxTimeSpan& diff) const;
+        // subtract a time span (positive or negative)
+    inline wxDateTime& Subtract(const wxTimeSpan& diff);
+        // subtract a time span (positive or negative)
     inline wxDateTime& operator-=(const wxTimeSpan& diff);
 
         // return the sum of the date with a date span
@@ -869,14 +909,14 @@ public:
     inline wxDateTime& operator+=(const wxDateSpan& diff);
 
         // return the difference of the date with a date span
-    inline wxDateTime Substract(const wxDateSpan& diff) const;
-        // substract a date span (positive or negative)
-    inline wxDateTime& Substract(const wxDateSpan& diff);
-        // substract a date span (positive or negative)
+    inline wxDateTime Subtract(const wxDateSpan& diff) const;
+        // subtract a date span (positive or negative)
+    inline wxDateTime& Subtract(const wxDateSpan& diff);
+        // subtract a date span (positive or negative)
     inline wxDateTime& operator-=(const wxDateSpan& diff);
 
         // return the difference between two dates
-    inline wxTimeSpan Substract(const wxDateTime& dt) const;
+    inline wxTimeSpan Subtract(const wxDateTime& dt) const;
 
     // conversion to/from text: all conversions from text return the pointer to
     // the next character following the date specification (i.e. the one where
@@ -961,11 +1001,11 @@ private:
 
 // ----------------------------------------------------------------------------
 // This class contains a difference between 2 wxDateTime values, so it makes
-// sense to add it to wxDateTime and it is the result of substraction of 2
+// sense to add it to wxDateTime and it is the result of subtraction of 2
 // objects of that class. See also wxDateSpan.
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxTimeSpan
+class WXDLLIMPEXP_BASE wxTimeSpan
 {
 public:
     // constructors
@@ -1017,11 +1057,11 @@ public:
     wxTimeSpan& operator+=(const wxTimeSpan& diff) { return Add(diff); }
 
         // return the difference of two timespans
-    inline wxTimeSpan Substract(const wxTimeSpan& diff) const;
-        // substract another timespan
-    inline wxTimeSpan& Substract(const wxTimeSpan& diff);
-        // substract another timespan
-    wxTimeSpan& operator-=(const wxTimeSpan& diff) { return Substract(diff); }
+    inline wxTimeSpan Subtract(const wxTimeSpan& diff) const;
+        // subtract another timespan
+    inline wxTimeSpan& Subtract(const wxTimeSpan& diff);
+        // subtract another timespan
+    wxTimeSpan& operator-=(const wxTimeSpan& diff) { return Subtract(diff); }
 
         // multiply timespan by a scalar
     inline wxTimeSpan Multiply(int n) const;
@@ -1094,11 +1134,7 @@ public:
         // resulting text representation. Notice that only some of format
         // specifiers valid for wxDateTime are valid for wxTimeSpan: hours,
         // minutes and seconds make sense, but not "PM/AM" string for example.
-    wxString Format(const wxChar *format = _T("%c")) const;
-        // preferred date representation for the current locale
-    wxString FormatDate() const { return Format(_T("%x")); }
-        // preferred time representation for the current locale
-    wxString FormatTime() const { return Format(_T("%X")); }
+    wxString Format(const wxChar *format = _T("%H:%M:%S")) const;
 
     // implementation
     // ------------------------------------------------------------------------
@@ -1125,7 +1161,7 @@ private:
 // won't be changed unless the resulting date would be invalid: for example,
 // Jan 31 + 1 month will be Feb 28, not (non existing) Feb 31.
 //
-// Because of this feature, adding and substracting back again the same
+// Because of this feature, adding and subtracting back again the same
 // wxDateSpan will *not*, in general give back the original date: Feb 28 - 1
 // month will be Jan 28, not Jan 31!
 //
@@ -1138,12 +1174,18 @@ private:
 // Beware about weeks: if you specify both weeks and days, the total number of
 // days added will be 7*weeks + days! See also GetTotalDays() function.
 //
+// Equality operators are defined for wxDateSpans. Two datespans are equal if
+// they both give the same target date when added to *every* source date.
+// Thus wxDateSpan::Months(1) is not equal to wxDateSpan::Days(30), because
+// they not give the same date when added to 1 Feb. But wxDateSpan::Days(14) is
+// equal to wxDateSpan::Weeks(2)
+//
 // Finally, notice that for adding hours, minutes &c you don't need this
 // class: wxTimeSpan will do the job because there are no subtleties
 // associated with those.
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxDateSpan
+class WXDLLIMPEXP_BASE wxDateSpan
 {
 public:
     // constructors
@@ -1212,10 +1254,10 @@ public:
     inline wxDateSpan& operator+=(const wxDateSpan& other);
 
         // return difference of two date spans
-    inline wxDateSpan Substract(const wxDateSpan& other) const;
-        // substract another wxDateSpan from us
-    inline wxDateSpan& Substract(const wxDateSpan& other);
-        // substract another wxDateSpan from us
+    inline wxDateSpan Subtract(const wxDateSpan& other) const;
+        // subtract another wxDateSpan from us
+    inline wxDateSpan& Subtract(const wxDateSpan& other);
+        // subtract another wxDateSpan from us
     inline wxDateSpan& operator-=(const wxDateSpan& other);
 
         // return a copy of this time span with changed sign
@@ -1245,7 +1287,7 @@ private:
 
 #include "wx/dynarray.h"
 
-WX_DECLARE_OBJARRAY(wxDateTime, wxDateTimeArray);
+WX_DECLARE_EXPORTED_OBJARRAY(wxDateTime, wxDateTimeArray);
 
 // ----------------------------------------------------------------------------
 // wxDateTimeHolidayAuthority: an object of this class will decide whether a
@@ -1256,11 +1298,13 @@ WX_DECLARE_OBJARRAY(wxDateTime, wxDateTimeArray);
 //     virtual methods to work with the holidays they correspond to.
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxDateTimeHolidayAuthority;
-WX_DEFINE_ARRAY(wxDateTimeHolidayAuthority *, wxHolidayAuthoritiesArray);
+class WXDLLIMPEXP_BASE wxDateTimeHolidayAuthority;
+WX_DEFINE_EXPORTED_ARRAY(wxDateTimeHolidayAuthority *, wxHolidayAuthoritiesArray);
 
-class WXDLLEXPORT wxDateTimeHolidayAuthority
+class wxDateTimeHolidaysModule;
+class WXDLLIMPEXP_BASE wxDateTimeHolidayAuthority
 {
+friend class wxDateTimeHolidaysModule;
 public:
     // returns TRUE if the given date is a holiday
     static bool IsHoliday(const wxDateTime& dt);
@@ -1278,6 +1322,9 @@ public:
     // wxDateTimeHolidayAuthority)
     static void AddAuthority(wxDateTimeHolidayAuthority *auth);
 
+    // the base class must have a virtual dtor
+    virtual ~wxDateTimeHolidayAuthority();
+
 protected:
     // this function is called to determine whether a given day is a holiday
     virtual bool DoIsHoliday(const wxDateTime& dt) const = 0;
@@ -1300,7 +1347,7 @@ private:
 };
 
 // the holidays for this class are all Saturdays and Sundays
-class WXDLLEXPORT wxDateTimeWorkDays : public wxDateTimeHolidayAuthority
+class WXDLLIMPEXP_BASE wxDateTimeWorkDays : public wxDateTimeHolidayAuthority
 {
 protected:
     virtual bool DoIsHoliday(const wxDateTime& dt) const;
@@ -1317,14 +1364,16 @@ protected:
 // else than datetime.cpp in debug builds: this minimizes rebuilds if we change
 // some inline function and the performance doesn't matter in the debug builds.
 
-#if !defined(__WXDEBUG__) || defined(wxDEFINE_TIME_CONSTANTS)
+#if !defined(wxDATETIME_DONT_INLINE) || defined(wxDEFINE_TIME_CONSTANTS)
     #define INCLUDED_FROM_WX_DATETIME_H
         #include "wx/datetime.inl"
     #undef INCLUDED_FROM_WX_DATETIME_H
 #endif
 
 // if we defined it to be empty above, restore it now
-#undef inline
+#ifdef wxDATETIME_DONT_INLINE
+    #undef inline
+#endif
 
 // ============================================================================
 // binary operators
@@ -1339,75 +1388,75 @@ protected:
 
 // no need to check for validity - the member functions we call will do it
 
-inline wxDateTime WXDLLEXPORT operator+(const wxDateTime& dt,
+inline wxDateTime WXDLLIMPEXP_BASE operator+(const wxDateTime& dt,
                                         const wxTimeSpan& ts)
 {
     return dt.Add(ts);
 }
 
-inline wxDateTime WXDLLEXPORT operator-(const wxDateTime& dt,
+inline wxDateTime WXDLLIMPEXP_BASE operator-(const wxDateTime& dt,
                                         const wxTimeSpan& ts)
 {
-    return dt.Substract(ts);
+    return dt.Subtract(ts);
 }
 
-inline wxDateTime WXDLLEXPORT operator+(const wxDateTime& dt,
+inline wxDateTime WXDLLIMPEXP_BASE operator+(const wxDateTime& dt,
                                         const wxDateSpan& ds)
 {
     return dt.Add(ds);
 }
 
-inline wxDateTime WXDLLEXPORT operator-(const wxDateTime& dt,
+inline wxDateTime WXDLLIMPEXP_BASE operator-(const wxDateTime& dt,
                                         const wxDateSpan& ds)
 {
-    return dt.Substract(ds);
+    return dt.Subtract(ds);
 }
 
-inline wxTimeSpan WXDLLEXPORT operator-(const wxDateTime& dt1,
+inline wxTimeSpan WXDLLIMPEXP_BASE operator-(const wxDateTime& dt1,
                                         const wxDateTime& dt2)
 {
-    return dt1.Substract(dt2);
+    return dt1.Subtract(dt2);
 }
 
 // comparison
 // ----------
 
-inline bool WXDLLEXPORT operator<(const wxDateTime& t1, const wxDateTime& t2)
+inline bool WXDLLIMPEXP_BASE operator<(const wxDateTime& t1, const wxDateTime& t2)
 {
     wxASSERT_MSG( t1.IsValid() && t2.IsValid(), _T("invalid wxDateTime") );
 
     return t1.GetValue() < t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator<=(const wxDateTime& t1, const wxDateTime& t2)
+inline bool WXDLLIMPEXP_BASE operator<=(const wxDateTime& t1, const wxDateTime& t2)
 {
     wxASSERT_MSG( t1.IsValid() && t2.IsValid(), _T("invalid wxDateTime") );
 
     return t1.GetValue() <= t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator>(const wxDateTime& t1, const wxDateTime& t2)
+inline bool WXDLLIMPEXP_BASE operator>(const wxDateTime& t1, const wxDateTime& t2)
 {
     wxASSERT_MSG( t1.IsValid() && t2.IsValid(), _T("invalid wxDateTime") );
 
     return t1.GetValue() > t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator>=(const wxDateTime& t1, const wxDateTime& t2)
+inline bool WXDLLIMPEXP_BASE operator>=(const wxDateTime& t1, const wxDateTime& t2)
 {
     wxASSERT_MSG( t1.IsValid() && t2.IsValid(), _T("invalid wxDateTime") );
 
     return t1.GetValue() >= t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator==(const wxDateTime& t1, const wxDateTime& t2)
+inline bool WXDLLIMPEXP_BASE operator==(const wxDateTime& t1, const wxDateTime& t2)
 {
     wxASSERT_MSG( t1.IsValid() && t2.IsValid(), _T("invalid wxDateTime") );
 
     return t1.GetValue() == t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator!=(const wxDateTime& t1, const wxDateTime& t2)
+inline bool WXDLLIMPEXP_BASE operator!=(const wxDateTime& t1, const wxDateTime& t2)
 {
     wxASSERT_MSG( t1.IsValid() && t2.IsValid(), _T("invalid wxDateTime") );
 
@@ -1421,24 +1470,24 @@ inline bool WXDLLEXPORT operator!=(const wxDateTime& t1, const wxDateTime& t2)
 // arithmetics
 // -----------
 
-inline wxTimeSpan WXDLLEXPORT operator+(const wxTimeSpan& ts1,
+inline wxTimeSpan WXDLLIMPEXP_BASE operator+(const wxTimeSpan& ts1,
                                         const wxTimeSpan& ts2)
 {
     return wxTimeSpan(ts1.GetValue() + ts2.GetValue());
 }
 
-inline wxTimeSpan WXDLLEXPORT operator-(const wxTimeSpan& ts1,
+inline wxTimeSpan WXDLLIMPEXP_BASE operator-(const wxTimeSpan& ts1,
                                         const wxTimeSpan& ts2)
 {
     return wxTimeSpan(ts1.GetValue() - ts2.GetValue());
 }
 
-inline wxTimeSpan WXDLLEXPORT operator*(const wxTimeSpan& ts, int n)
+inline wxTimeSpan WXDLLIMPEXP_BASE operator*(const wxTimeSpan& ts, int n)
 {
     return wxTimeSpan(ts).Multiply(n);
 }
 
-inline wxTimeSpan WXDLLEXPORT operator*(int n, const wxTimeSpan& ts)
+inline wxTimeSpan WXDLLIMPEXP_BASE operator*(int n, const wxTimeSpan& ts)
 {
     return wxTimeSpan(ts).Multiply(n);
 }
@@ -1446,32 +1495,32 @@ inline wxTimeSpan WXDLLEXPORT operator*(int n, const wxTimeSpan& ts)
 // comparison
 // ----------
 
-inline bool WXDLLEXPORT operator<(const wxTimeSpan &t1, const wxTimeSpan &t2)
+inline bool WXDLLIMPEXP_BASE operator<(const wxTimeSpan &t1, const wxTimeSpan &t2)
 {
     return t1.GetValue() < t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator<=(const wxTimeSpan &t1, const wxTimeSpan &t2)
+inline bool WXDLLIMPEXP_BASE operator<=(const wxTimeSpan &t1, const wxTimeSpan &t2)
 {
     return t1.GetValue() <= t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator>(const wxTimeSpan &t1, const wxTimeSpan &t2)
+inline bool WXDLLIMPEXP_BASE operator>(const wxTimeSpan &t1, const wxTimeSpan &t2)
 {
     return t1.GetValue() > t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator>=(const wxTimeSpan &t1, const wxTimeSpan &t2)
+inline bool WXDLLIMPEXP_BASE operator>=(const wxTimeSpan &t1, const wxTimeSpan &t2)
 {
     return t1.GetValue() >= t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator==(const wxTimeSpan &t1, const wxTimeSpan &t2)
+inline bool WXDLLIMPEXP_BASE operator==(const wxTimeSpan &t1, const wxTimeSpan &t2)
 {
     return t1.GetValue() == t2.GetValue();
 }
 
-inline bool WXDLLEXPORT operator!=(const wxTimeSpan &t1, const wxTimeSpan &t2)
+inline bool WXDLLIMPEXP_BASE operator!=(const wxTimeSpan &t1, const wxTimeSpan &t2)
 {
     return t1.GetValue() != t2.GetValue();
 }
@@ -1480,10 +1529,28 @@ inline bool WXDLLEXPORT operator!=(const wxTimeSpan &t1, const wxTimeSpan &t2)
 // wxDateSpan
 // ----------------------------------------------------------------------------
 
+// comparison
+// ----------
+
+// ds1 == d2 if and only if for every wxDateTime t t + ds1 == t + ds2
+inline WXDLLIMPEXP_BASE bool operator==(const wxDateSpan& ds1,
+                                   const wxDateSpan& ds2)
+{
+    return ds1.GetYears() == ds2.GetYears() &&
+           ds1.GetMonths() == ds2.GetMonths() &&
+           ds1.GetTotalDays() == ds2.GetTotalDays();
+}
+
+inline WXDLLIMPEXP_BASE bool operator!=(const wxDateSpan& ds1,
+                                   const wxDateSpan& ds2)
+{
+  return !(ds1 == ds2);
+}
+
 // arithmetics
 // -----------
 
-inline WXDLLEXPORT wxDateSpan operator+(const wxDateSpan& ds1,
+inline WXDLLIMPEXP_BASE wxDateSpan operator+(const wxDateSpan& ds1,
                                         const wxDateSpan& ds2)
 {
     return wxDateSpan(ds1.GetYears() + ds2.GetYears(),
@@ -1492,7 +1559,7 @@ inline WXDLLEXPORT wxDateSpan operator+(const wxDateSpan& ds1,
                       ds1.GetDays() + ds2.GetDays());
 }
 
-inline WXDLLEXPORT wxDateSpan operator-(const wxDateSpan& ds1,
+inline WXDLLIMPEXP_BASE wxDateSpan operator-(const wxDateSpan& ds1,
                                         const wxDateSpan& ds2)
 {
     return wxDateSpan(ds1.GetYears() - ds2.GetYears(),
@@ -1501,12 +1568,12 @@ inline WXDLLEXPORT wxDateSpan operator-(const wxDateSpan& ds1,
                       ds1.GetDays() - ds2.GetDays());
 }
 
-inline WXDLLEXPORT wxDateSpan operator*(const wxDateSpan& ds, int n)
+inline WXDLLIMPEXP_BASE wxDateSpan operator*(const wxDateSpan& ds, int n)
 {
     return wxDateSpan(ds).Multiply(n);
 }
 
-inline WXDLLEXPORT wxDateSpan operator*(int n, const wxDateSpan& ds)
+inline WXDLLIMPEXP_BASE wxDateSpan operator*(int n, const wxDateSpan& ds)
 {
     return wxDateSpan(ds).Multiply(n);
 }
@@ -1521,7 +1588,7 @@ inline WXDLLEXPORT wxDateSpan operator*(int n, const wxDateSpan& ds)
 //  for ( m = wxDateTime::Jan; m < wxDateTime::Inv_Month; wxNextMonth(m) )
 // ----------------------------------------------------------------------------
 
-inline WXDLLEXPORT void wxNextMonth(wxDateTime::Month& m)
+inline WXDLLIMPEXP_BASE void wxNextMonth(wxDateTime::Month& m)
 {
     wxASSERT_MSG( m < wxDateTime::Inv_Month, _T("invalid month") );
 
@@ -1529,7 +1596,7 @@ inline WXDLLEXPORT void wxNextMonth(wxDateTime::Month& m)
     m = (wxDateTime::Month)(m + 1);
 }
 
-inline WXDLLEXPORT void wxPrevMonth(wxDateTime::Month& m)
+inline WXDLLIMPEXP_BASE void wxPrevMonth(wxDateTime::Month& m)
 {
     wxASSERT_MSG( m < wxDateTime::Inv_Month, _T("invalid month") );
 
@@ -1537,7 +1604,7 @@ inline WXDLLEXPORT void wxPrevMonth(wxDateTime::Month& m)
                              : (wxDateTime::Month)(m - 1);
 }
 
-inline WXDLLEXPORT void wxNextWDay(wxDateTime::WeekDay& wd)
+inline WXDLLIMPEXP_BASE void wxNextWDay(wxDateTime::WeekDay& wd)
 {
     wxASSERT_MSG( wd < wxDateTime::Inv_WeekDay, _T("invalid week day") );
 
@@ -1545,7 +1612,7 @@ inline WXDLLEXPORT void wxNextWDay(wxDateTime::WeekDay& wd)
     wd = (wxDateTime::WeekDay)(wd + 1);
 }
 
-inline WXDLLEXPORT void wxPrevWDay(wxDateTime::WeekDay& wd)
+inline WXDLLIMPEXP_BASE void wxPrevWDay(wxDateTime::WeekDay& wd)
 {
     wxASSERT_MSG( wd < wxDateTime::Inv_WeekDay, _T("invalid week day") );
 
@@ -1553,4 +1620,6 @@ inline WXDLLEXPORT void wxPrevWDay(wxDateTime::WeekDay& wd)
                                : (wxDateTime::WeekDay)(wd - 1);
 }
 
+#endif // wxUSE_DATETIME
+
 #endif // _WX_DATETIME_H