+void wxDateTime::Tm::AddMonths(wxDateTime::wxDateTime_t monDiff)
+{
+ // normalize the months field
+ while ( monDiff < -mon )
+ {
+ year--;
+
+ monDiff += MONTHS_IN_YEAR;
+ }
+
+ while ( monDiff + mon > MONTHS_IN_YEAR )
+ {
+ year++;
+ }
+
+ mon = (wxDateTime::Month)(mon + monDiff);
+
+ wxASSERT_MSG( mon >= 0 && mon < 12, _T("logic error") );
+}
+
+void wxDateTime::Tm::AddDays(wxDateTime::wxDateTime_t dayDiff)
+{
+ // normalize the days field
+ mday += dayDiff;
+ while ( mday < 1 )
+ {
+ AddMonths(-1);
+
+ mday += GetNumOfDaysInMonth(year, mon);
+ }
+
+ while ( mday > GetNumOfDaysInMonth(year, mon) )
+ {
+ mday -= GetNumOfDaysInMonth(year, mon);
+
+ AddMonths(1);
+ }
+
+ wxASSERT_MSG( mday > 0 && mday <= GetNumOfDaysInMonth(year, mon),
+ _T("logic error") );
+}
+
+// ----------------------------------------------------------------------------
+// class TimeZone
+// ----------------------------------------------------------------------------
+
+wxDateTime::TimeZone::TimeZone(wxDateTime::TZ tz)
+{
+ switch ( tz )
+ {
+ case wxDateTime::Local:
+ // leave offset to be 0
+ break;
+
+ case wxDateTime::GMT_12:
+ case wxDateTime::GMT_11:
+ case wxDateTime::GMT_10:
+ case wxDateTime::GMT_9:
+ case wxDateTime::GMT_8:
+ case wxDateTime::GMT_7:
+ case wxDateTime::GMT_6:
+ case wxDateTime::GMT_5:
+ case wxDateTime::GMT_4:
+ case wxDateTime::GMT_3:
+ case wxDateTime::GMT_2:
+ case wxDateTime::GMT_1:
+ m_offset = -60*(wxDateTime::GMT0 - tz);
+ break;
+
+ case wxDateTime::GMT0:
+ case wxDateTime::GMT1:
+ case wxDateTime::GMT2:
+ case wxDateTime::GMT3:
+ case wxDateTime::GMT4:
+ case wxDateTime::GMT5:
+ case wxDateTime::GMT6:
+ case wxDateTime::GMT7:
+ case wxDateTime::GMT8:
+ case wxDateTime::GMT9:
+ case wxDateTime::GMT10:
+ case wxDateTime::GMT11:
+ case wxDateTime::GMT12:
+ m_offset = 60*(tz - wxDateTime::GMT0);
+ break;
+
+ case wxDateTime::A_CST:
+ // Central Standard Time in use in Australia = UTC + 9.5
+ m_offset = 9*60 + 30;
+ break;
+
+ default:
+ wxFAIL_MSG( _T("unknown time zone") );
+ }
+}
+