]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datetime.cpp
define wxEventLoopBase::ms_activeLoop in appcmn.cpp instead of doing it in all platfo...
[wxWidgets.git] / src / common / datetime.cpp
index ec0c9c5ccf1c6649354124c0fa4d2feb6a1933ad..c797fc0144ee085109bdde0917d4e821306d416f 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        wx/datetime.h
+// Name:        src/common/datetime.cpp
 // Purpose:     implementation of time/date related classes
 // Author:      Vadim Zeitlin
 // Modified by:
 // Purpose:     implementation of time/date related classes
 // Author:      Vadim Zeitlin
 // Modified by:
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
+// TODO: for $DEITY sake, someone please fix the #ifdef __WXWINCE__ everywhere,
+//       the proper way to do it is to implement (subset of) wxStrftime() for
+//       CE instead of this horror!!
+
 /*
  * Implementation notes:
  *
 /*
  * Implementation notes:
  *
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "datetime.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -80,7 +80,9 @@
 #ifdef __WINDOWS__
     #include "wx/msw/wrapwin.h"
     #include <winnls.h>
 #ifdef __WINDOWS__
     #include "wx/msw/wrapwin.h"
     #include <winnls.h>
-    #include <locale.h>
+    #ifndef __WXWINCE__
+        #include <locale.h>
+    #endif
 #endif
 
 #include "wx/datetime.h"
 #endif
 
 #include "wx/datetime.h"
@@ -121,6 +123,18 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringCon
     #undef HAVE_STRPTIME
 #endif // broken strptime()
 
     #undef HAVE_STRPTIME
 #endif // broken strptime()
 
+#if defined(HAVE_STRPTIME) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS
+    // configure detects strptime as linkable because it's in the OS X
+    // System library but MSL headers don't declare it.
+
+//    char *strptime(const char *, const char *, struct tm *);
+    // However, we DON'T want to just provide it here because we would
+    // crash and/or overwrite data when strptime from OS X tries
+    // to fill in MW's struct tm which is two fields shorter (no TZ stuff)
+    // So for now let's just say we don't have strptime
+    #undef HAVE_STRPTIME
+#endif
+
 #if defined(__MWERKS__) && wxUSE_UNICODE
     #include <wtime.h>
 #endif
 #if defined(__MWERKS__) && wxUSE_UNICODE
     #include <wtime.h>
 #endif
@@ -155,6 +169,36 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringCon
     #endif
 #endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM
 
     #endif
 #endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM
 
+#if (!defined(HAVE_LOCALTIME_R) || !defined(HAVE_GMTIME_R)) && wxUSE_THREADS && !defined(__WINDOWS__)
+static wxMutex timeLock;
+#endif
+
+#ifndef HAVE_LOCALTIME_R
+struct tm *wxLocaltime_r(const time_t* ticks, struct tm* temp)
+{
+#if wxUSE_THREADS && !defined(__WINDOWS__)
+  // No need to waste time with a mutex on windows since it's using
+  // thread local storage for localtime anyway.
+  wxMutexLocker locker(timeLock);
+#endif
+  memcpy(temp, localtime(ticks), sizeof(struct tm));
+  return temp;
+}
+#endif
+
+#ifndef HAVE_GMTIME_R
+struct tm *wxGmtime_r(const time_t* ticks, struct tm* temp)
+{
+#if wxUSE_THREADS && !defined(__WINDOWS__)
+  // No need to waste time with a mutex on windows since it's
+  // using thread local storage for gmtime anyway.
+  wxMutexLocker locker(timeLock);
+#endif
+  memcpy(temp, gmtime(ticks), sizeof(struct tm));
+  return temp;
+}
+#endif
+
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
@@ -217,11 +261,14 @@ static const long MILLISECONDS_PER_DAY = 86400000l;
 // (i.e. JDN(Jan 1, 1970) = 2440587.5)
 static const long EPOCH_JDN = 2440587l;
 
 // (i.e. JDN(Jan 1, 1970) = 2440587.5)
 static const long EPOCH_JDN = 2440587l;
 
+// used only in asserts
+#ifdef __WXDEBUG__
 // the date of JDN -0.5 (as we don't work with fractional parts, this is the
 // reference date for us) is Nov 24, 4714BC
 static const int JDN_0_YEAR = -4713;
 static const int JDN_0_MONTH = wxDateTime::Nov;
 static const int JDN_0_DAY = 24;
 // the date of JDN -0.5 (as we don't work with fractional parts, this is the
 // reference date for us) is Nov 24, 4714BC
 static const int JDN_0_YEAR = -4713;
 static const int JDN_0_MONTH = wxDateTime::Nov;
 static const int JDN_0_DAY = 24;
+#endif // __WXDEBUG__
 
 // the constants used for JDN calculations
 static const long JDN_OFFSET         = 32046l;
 
 // the constants used for JDN calculations
 static const long JDN_OFFSET         = 32046l;
@@ -290,15 +337,16 @@ static int GetTimeZone()
     static bool s_timezoneSet = false;
     static long gmtoffset = LONG_MAX; // invalid timezone
 
     static bool s_timezoneSet = false;
     static long gmtoffset = LONG_MAX; // invalid timezone
 
-    // ensure that the timezone variable is set by calling localtime
+    // ensure that the timezone variable is set by calling wxLocaltime_r
     if ( !s_timezoneSet )
     {
     if ( !s_timezoneSet )
     {
-        // just call localtime() instead of figuring out whether this system
-        // supports tzset(), _tzset() or something else
+        // just call wxLocaltime_r() instead of figuring out whether this
+        // system supports tzset(), _tzset() or something else
         time_t t = 0;
         struct tm *tm;
         time_t t = 0;
         struct tm *tm;
+        struct tm tmstruct;
 
 
-        tm = localtime(&t);
+        tm = wxLocaltime_r(&t, &tmstruct);
         s_timezoneSet = true;
 
         // note that GMT offset is the opposite of time zone and so to return
         s_timezoneSet = true;
 
         // note that GMT offset is the opposite of time zone and so to return
@@ -353,24 +401,31 @@ static long GetTruncatedJDN(wxDateTime::wxDateTime_t day,
             - JDN_OFFSET;
 }
 
             - JDN_OFFSET;
 }
 
+#ifndef __WXWINCE__
 // this function is a wrapper around strftime(3) adding error checking
 static wxString CallStrftime(const wxChar *format, const tm* tm)
 {
     wxChar buf[4096];
 // this function is a wrapper around strftime(3) adding error checking
 static wxString CallStrftime(const wxChar *format, const tm* tm)
 {
     wxChar buf[4096];
-       if ( !wxStrftime(buf, WXSIZEOF(buf), format, tm) )
+    // Create temp wxString here to work around mingw/cygwin bug 1046059
+    // http://sourceforge.net/tracker/?func=detail&atid=102435&aid=1046059&group_id=2435
+    wxString s;
+
+    if ( !wxStrftime(buf, WXSIZEOF(buf), format, tm) )
     {
         // buffer is too small?
         wxFAIL_MSG(_T("strftime() failed"));
     }
 
     {
         // buffer is too small?
         wxFAIL_MSG(_T("strftime() failed"));
     }
 
-    return wxString(buf);
+    s = buf;
+    return s;
 }
 }
+#endif
 
 #ifdef HAVE_STRPTIME
 
 
 #ifdef HAVE_STRPTIME
 
-// glibc2 doesn't define this in the headers unless _XOPEN_SOURCE is defined
-// which, unfortunately, wreaks havoc elsewhere
-#if defined(__GLIBC__) && (__GLIBC__ == 2)
+#if wxUSE_UNIX && !defined(HAVE_STRPTIME_DECL)
+    // configure detected that we had strptime() but not its declaration,
+    // provide it ourselves
     extern "C" char *strptime(const char *, const char *, struct tm *);
 #endif
 
     extern "C" char *strptime(const char *, const char *, struct tm *);
 #endif
 
@@ -406,10 +461,11 @@ static void ReplaceDefaultYearMonthWithCurrent(int *year,
                                                wxDateTime::Month *month)
 {
     struct tm *tmNow = NULL;
                                                wxDateTime::Month *month)
 {
     struct tm *tmNow = NULL;
+    struct tm tmstruct;
 
     if ( *year == wxDateTime::Inv_Year )
     {
 
     if ( *year == wxDateTime::Inv_Year )
     {
-        tmNow = wxDateTime::GetTmNow();
+        tmNow = wxDateTime::GetTmNow(&tmstruct);
 
         *year = 1900 + tmNow->tm_year;
     }
 
         *year = 1900 + tmNow->tm_year;
     }
@@ -417,7 +473,7 @@ static void ReplaceDefaultYearMonthWithCurrent(int *year,
     if ( *month == wxDateTime::Inv_Month )
     {
         if ( !tmNow )
     if ( *month == wxDateTime::Inv_Month )
     {
         if ( !tmNow )
-            tmNow = wxDateTime::GetTmNow();
+            tmNow = wxDateTime::GetTmNow(&tmstruct);
 
         *month = (wxDateTime::Month)tmNow->tm_mon;
     }
 
         *month = (wxDateTime::Month)tmNow->tm_mon;
     }
@@ -498,6 +554,13 @@ static wxDateTime::WeekDay GetWeekDayFromName(const wxString& name, int flags)
     return wd;
 }
 
     return wd;
 }
 
+/* static */
+struct tm *wxDateTime::GetTmNow(struct tm *tmstruct)
+{
+    time_t t = GetTimeNow();
+    return wxLocaltime_r(&t, tmstruct);
+}
+
 // scans all digits (but no more than len) and returns the resulting number
 static bool GetNumericToken(size_t len, const wxChar*& p, unsigned long *number)
 {
 // scans all digits (but no more than len) and returns the resulting number
 static bool GetNumericToken(size_t len, const wxChar*& p, unsigned long *number)
 {
@@ -667,7 +730,7 @@ wxDateTime::TimeZone::TimeZone(wxDateTime::TZ tz)
 
         case wxDateTime::A_CST:
             // Central Standard Time in use in Australia = UTC + 9.5
 
         case wxDateTime::A_CST:
             // Central Standard Time in use in Australia = UTC + 9.5
-            m_offset = 60l*(9*60 + 30);
+            m_offset = 60l*(9*MIN_PER_HOUR + MIN_PER_HOUR/2);
             break;
 
         default:
             break;
 
         default:
@@ -821,47 +884,47 @@ wxString wxDateTime::GetMonthName(wxDateTime::Month month,
 
     return CallStrftime(flags == Name_Abbr ? _T("%b") : _T("%B"), &tm);
 #else
 
     return CallStrftime(flags == Name_Abbr ? _T("%b") : _T("%B"), &tm);
 #else
-       wxString ret;
-       switch(month)
-       {
-               case Jan: 
-                       ret = (flags == Name_Abbr ? wxT("Jan"): wxT("January"));
-                       break;
-               case Feb: 
-                       ret = (flags == Name_Abbr ? wxT("Feb"): wxT("Febuary"));
-                       break;
-               case Mar: 
-                       ret = (flags == Name_Abbr ? wxT("Mar"): wxT("March"));
-                       break;
-               case Apr: 
-                       ret = (flags == Name_Abbr ? wxT("Apr"): wxT("April"));
-                       break;
-               case May: 
-                       ret = (flags == Name_Abbr ? wxT("May"): wxT("May"));
-                       break;
-               case Jun: 
-                       ret = (flags == Name_Abbr ? wxT("Jun"): wxT("June"));
-                       break;
-               case Jul: 
-                       ret = (flags == Name_Abbr ? wxT("Jul"): wxT("July"));
-                       break;
-               case Aug: 
-                       ret = (flags == Name_Abbr ? wxT("Aug"): wxT("August"));
-                       break;
-               case Sep: 
-                       ret = (flags == Name_Abbr ? wxT("Sep"): wxT("September"));
-                       break;
-               case Oct: 
-                       ret = (flags == Name_Abbr ? wxT("Oct"): wxT("October"));
-                       break;
-               case Nov: 
-                       ret = (flags == Name_Abbr ? wxT("Nov"): wxT("November"));
-                       break;
-               case Dec: 
-                       ret = (flags == Name_Abbr ? wxT("Dec"): wxT("December"));
-                       break;
-       }
-       return ret;
+    wxString ret;
+    switch(month)
+    {
+        case Jan:
+            ret = (flags == Name_Abbr ? wxT("Jan"): wxT("January"));
+            break;
+        case Feb:
+            ret = (flags == Name_Abbr ? wxT("Feb"): wxT("Febuary"));
+            break;
+        case Mar:
+            ret = (flags == Name_Abbr ? wxT("Mar"): wxT("March"));
+            break;
+        case Apr:
+            ret = (flags == Name_Abbr ? wxT("Apr"): wxT("April"));
+            break;
+        case May:
+            ret = (flags == Name_Abbr ? wxT("May"): wxT("May"));
+            break;
+        case Jun:
+            ret = (flags == Name_Abbr ? wxT("Jun"): wxT("June"));
+            break;
+        case Jul:
+            ret = (flags == Name_Abbr ? wxT("Jul"): wxT("July"));
+            break;
+        case Aug:
+            ret = (flags == Name_Abbr ? wxT("Aug"): wxT("August"));
+            break;
+        case Sep:
+            ret = (flags == Name_Abbr ? wxT("Sep"): wxT("September"));
+            break;
+        case Oct:
+            ret = (flags == Name_Abbr ? wxT("Oct"): wxT("October"));
+            break;
+        case Nov:
+            ret = (flags == Name_Abbr ? wxT("Nov"): wxT("November"));
+            break;
+        case Dec:
+            ret = (flags == Name_Abbr ? wxT("Dec"): wxT("December"));
+            break;
+    }
+    return ret;
 #endif
 }
 
 #endif
 }
 
@@ -889,32 +952,32 @@ wxString wxDateTime::GetWeekDayName(wxDateTime::WeekDay wday,
     // ... and call strftime()
     return CallStrftime(flags == Name_Abbr ? _T("%a") : _T("%A"), &tm);
 #else
     // ... and call strftime()
     return CallStrftime(flags == Name_Abbr ? _T("%a") : _T("%A"), &tm);
 #else
-       wxString ret;
-       switch(wday)
-       {
-               case Sun: 
-                       ret = (flags == Name_Abbr ? wxT("Sun") : wxT("Sunday"));
-                       break;
-               case Mon:
-                       ret = (flags == Name_Abbr ? wxT("Mon") : wxT("Monday"));
-                       break;
-               case Tue:
-                       ret = (flags == Name_Abbr ? wxT("Tue") : wxT("Tuesday"));
-                       break;
-               case Wed:
-                       ret = (flags == Name_Abbr ? wxT("Wed") : wxT("Wednesday"));
-                       break;
-               case Thu:
-                       ret = (flags == Name_Abbr ? wxT("Thu") : wxT("Thursday"));
-                       break;
-               case Fri:
-                       ret = (flags == Name_Abbr ? wxT("Fri") : wxT("Friday"));
-                       break;
-               case Sat:
-                       ret = (flags == Name_Abbr ? wxT("Sat") : wxT("Saturday"));
-                       break;
-       }
-       return ret;
+    wxString ret;
+    switch(wday)
+    {
+        case Sun:
+            ret = (flags == Name_Abbr ? wxT("Sun") : wxT("Sunday"));
+            break;
+        case Mon:
+            ret = (flags == Name_Abbr ? wxT("Mon") : wxT("Monday"));
+            break;
+        case Tue:
+            ret = (flags == Name_Abbr ? wxT("Tue") : wxT("Tuesday"));
+            break;
+        case Wed:
+            ret = (flags == Name_Abbr ? wxT("Wed") : wxT("Wednesday"));
+            break;
+        case Thu:
+            ret = (flags == Name_Abbr ? wxT("Thu") : wxT("Thursday"));
+            break;
+        case Fri:
+            ret = (flags == Name_Abbr ? wxT("Fri") : wxT("Friday"));
+            break;
+        case Sat:
+            ret = (flags == Name_Abbr ? wxT("Sat") : wxT("Saturday"));
+            break;
+    }
+    return ret;
 
 #endif
 }
 
 #endif
 }
@@ -935,7 +998,7 @@ void wxDateTime::GetAmPmStrings(wxString *am, wxString *pm)
     // assert, even though it is a perfectly legal use.
     if ( am )
     {
     // assert, even though it is a perfectly legal use.
     if ( am )
     {
-        if (wxStrftime(buffer, sizeof buffer, _T("%p"), &tm) > 0)
+        if (wxStrftime(buffer, sizeof(buffer)/sizeof(wxChar), _T("%p"), &tm) > 0)
             *am = wxString(buffer);
         else
             *am = wxString();
             *am = wxString(buffer);
         else
             *am = wxString();
@@ -943,7 +1006,7 @@ void wxDateTime::GetAmPmStrings(wxString *am, wxString *pm)
     if ( pm )
     {
         tm.tm_hour = 13;
     if ( pm )
     {
         tm.tm_hour = 13;
-        if (wxStrftime(buffer, sizeof buffer, _T("%p"), &tm) > 0)
+        if (wxStrftime(buffer, sizeof(buffer)/sizeof(wxChar), _T("%p"), &tm) > 0)
             *pm = wxString(buffer);
         else
             *pm = wxString();
             *pm = wxString(buffer);
         else
             *pm = wxString();
@@ -964,7 +1027,8 @@ wxDateTime::Country wxDateTime::GetCountry()
     {
         // try to guess from the time zone name
         time_t t = time(NULL);
     {
         // try to guess from the time zone name
         time_t t = time(NULL);
-        struct tm *tm = localtime(&t);
+        struct tm tmstruct;
+        struct tm *tm = wxLocaltime_r(&t, &tmstruct);
 
         wxString tz = CallStrftime(_T("%Z"), tm);
         if ( tz == _T("WET") || tz == _T("WEST") )
 
         wxString tz = CallStrftime(_T("%Z"), tm);
         if ( tz == _T("WET") || tz == _T("WEST") )
@@ -1287,22 +1351,26 @@ wxDateTime& wxDateTime::Set(wxDateTime_t hour,
                       _T("Invalid time in wxDateTime::Set()") );
 
     // get the current date from system
                       _T("Invalid time in wxDateTime::Set()") );
 
     // get the current date from system
-    struct tm *tm = GetTmNow();
+    struct tm tmstruct;
+    struct tm *tm = GetTmNow(&tmstruct);
 
 
-    wxDATETIME_CHECK( tm, _T("localtime() failed") );
+    wxDATETIME_CHECK( tm, _T("wxLocaltime_r() failed") );
+
+    // make a copy so it isn't clobbered by the call to mktime() below
+    struct tm tm1(*tm);
 
     // adjust the time
 
     // adjust the time
-    tm->tm_hour = hour;
-    tm->tm_min = minute;
-    tm->tm_sec = second;
+    tm1.tm_hour = hour;
+    tm1.tm_min = minute;
+    tm1.tm_sec = second;
 
     // and the DST in case it changes on this date
 
     // and the DST in case it changes on this date
-    struct tm tm2(*tm);
+    struct tm tm2(tm1);
     mktime(&tm2);
     mktime(&tm2);
-    if ( tm2.tm_isdst != tm->tm_isdst )
-        tm->tm_isdst = tm2.tm_isdst;
+    if ( tm2.tm_isdst != tm1.tm_isdst )
+        tm1.tm_isdst = tm2.tm_isdst;
 
 
-    (void)Set(*tm);
+    (void)Set(tm1);
 
     // and finally adjust milliseconds
     return SetMillisecond(millisec);
 
     // and finally adjust milliseconds
     return SetMillisecond(millisec);
@@ -1377,20 +1445,9 @@ wxDateTime& wxDateTime::Set(double jdn)
     // EPOCH_JDN + 0.5
     jdn -= EPOCH_JDN + 0.5;
 
     // EPOCH_JDN + 0.5
     jdn -= EPOCH_JDN + 0.5;
 
-    jdn *= MILLISECONDS_PER_DAY;
-
-    // JDNs always suppose an UTC date, so bring it back to local time zone
-    // (also see GetJulianDayNumber() implementation)
-    long tzDiff = GetTimeZone();
-    if ( IsDST() == 1 )
-    {
-        // FIXME: again, we suppose that DST is always one hour
-        tzDiff -= 3600;
-    }
+    m_time.Assign(jdn*MILLISECONDS_PER_DAY);
 
 
-    jdn += tzDiff*1000; // tzDiff is in seconds
-
-    m_time.Assign(jdn);
+    // JDNs always are in UTC, so we don't need any adjustments for time zone
 
     return *this;
 }
 
     return *this;
 }
@@ -1463,7 +1520,8 @@ unsigned long wxDateTime::GetAsDOS() const
 {
     unsigned long ddt;
     time_t ticks = GetTicks();
 {
     unsigned long ddt;
     time_t ticks = GetTicks();
-    struct tm *tm = localtime(&ticks);
+    struct tm tmstruct;
+    struct tm *tm = wxLocaltime_r(&ticks, &tmstruct);
 
     long year = tm->tm_year;
     year -= 80;
 
     long year = tm->tm_year;
     year -= 80;
@@ -1501,14 +1559,15 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
     if ( time != (time_t)-1 )
     {
         // use C RTL functions
     if ( time != (time_t)-1 )
     {
         // use C RTL functions
+        struct tm tmstruct;
         tm *tm;
         if ( tz.GetOffset() == -GetTimeZone() )
         {
             // we are working with local time
         tm *tm;
         if ( tz.GetOffset() == -GetTimeZone() )
         {
             // we are working with local time
-            tm = localtime(&time);
+            tm = wxLocaltime_r(&time, &tmstruct);
 
             // should never happen
 
             // should never happen
-            wxCHECK_MSG( tm, Tm(), _T("localtime() failed") );
+            wxCHECK_MSG( tm, Tm(), _T("wxLocaltime_r() failed") );
         }
         else
         {
         }
         else
         {
@@ -1520,10 +1579,10 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
             if ( time >= 0 )
 #endif
             {
             if ( time >= 0 )
 #endif
             {
-                tm = gmtime(&time);
+                tm = wxGmtime_r(&time, &tmstruct);
 
                 // should never happen
 
                 // should never happen
-                wxCHECK_MSG( tm, Tm(), _T("gmtime() failed") );
+                wxCHECK_MSG( tm, Tm(), _T("wxGmtime_r() failed") );
             }
             else
             {
             }
             else
             {
@@ -1609,14 +1668,14 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
     timeOnly -= tm.msec;
     timeOnly /= 1000;               // now we have time in seconds
 
     timeOnly -= tm.msec;
     timeOnly /= 1000;               // now we have time in seconds
 
-    tm.sec = (wxDateTime_t)(timeOnly % 60);
+    tm.sec = (wxDateTime_t)(timeOnly % SEC_PER_MIN);
     timeOnly -= tm.sec;
     timeOnly -= tm.sec;
-    timeOnly /= 60;                 // now we have time in minutes
+    timeOnly /= SEC_PER_MIN;        // now we have time in minutes
 
 
-    tm.min = (wxDateTime_t)(timeOnly % 60);
+    tm.min = (wxDateTime_t)(timeOnly % MIN_PER_HOUR);
     timeOnly -= tm.min;
 
     timeOnly -= tm.min;
 
-    tm.hour = (wxDateTime_t)(timeOnly / 60);
+    tm.hour = (wxDateTime_t)(timeOnly / MIN_PER_HOUR);
 
     return tm;
 }
 
     return tm;
 }
@@ -1811,8 +1870,9 @@ wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday, WeekFlags flags)
 {
     wxDATETIME_CHECK( weekday != Inv_WeekDay, _T("invalid weekday") );
 
 {
     wxDATETIME_CHECK( weekday != Inv_WeekDay, _T("invalid weekday") );
 
-    int wdayThis = GetWeekDay();
-    if ( weekday == wdayThis )
+    int wdayDst = weekday,
+        wdayThis = GetWeekDay();
+    if ( wdayDst == wdayThis )
     {
         // nothing to do
         return *this;
     {
         // nothing to do
         return *this;
@@ -1826,21 +1886,23 @@ wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday, WeekFlags flags)
     // the logic below based on comparing weekday and wdayThis works if Sun (0)
     // is the first day in the week, but breaks down for Monday_First case so
     // we adjust the week days in this case
     // the logic below based on comparing weekday and wdayThis works if Sun (0)
     // is the first day in the week, but breaks down for Monday_First case so
     // we adjust the week days in this case
-    if( flags == Monday_First )
+    if ( flags == Monday_First )
     {
         if ( wdayThis == Sun )
             wdayThis += 7;
     {
         if ( wdayThis == Sun )
             wdayThis += 7;
+        if ( wdayDst == Sun )
+            wdayDst += 7;
     }
     //else: Sunday_First, nothing to do
 
     // go forward or back in time to the day we want
     }
     //else: Sunday_First, nothing to do
 
     // go forward or back in time to the day we want
-    if ( weekday < wdayThis )
+    if ( wdayDst < wdayThis )
     {
     {
-        return Subtract(wxDateSpan::Days(wdayThis - weekday));
+        return Subtract(wxDateSpan::Days(wdayThis - wdayDst));
     }
     else // weekday > wdayThis
     {
     }
     else // weekday > wdayThis
     {
-        return Add(wxDateSpan::Days(weekday - wdayThis));
+        return Add(wxDateSpan::Days(wdayDst - wdayThis));
     }
 }
 
     }
 }
 
@@ -2079,16 +2141,7 @@ wxDateTime& wxDateTime::SetToYearDay(wxDateTime::wxDateTime_t yday)
 
 double wxDateTime::GetJulianDayNumber() const
 {
 
 double wxDateTime::GetJulianDayNumber() const
 {
-    // JDN are always expressed for the UTC dates
-    Tm tm(ToTimezone(UTC).GetTm(UTC));
-
-    double result = GetTruncatedJDN(tm.mday, tm.mon, tm.year);
-
-    // add the part GetTruncatedJDN() neglected
-    result += 0.5;
-
-    // and now add the time: 86400 sec = 1 JDN
-    return result + ((double)(60*(60*tm.hour + tm.min) + tm.sec)) / 86400;
+    return m_time.ToDouble() / MILLISECONDS_PER_DAY + EPOCH_JDN + 0.5;
 }
 
 double wxDateTime::GetRataDie() const
 }
 
 double wxDateTime::GetRataDie() const
@@ -2110,9 +2163,10 @@ int wxDateTime::IsDST(wxDateTime::Country country) const
     time_t timet = GetTicks();
     if ( timet != (time_t)-1 )
     {
     time_t timet = GetTicks();
     if ( timet != (time_t)-1 )
     {
-        tm *tm = localtime(&timet);
+        struct tm tmstruct;
+        tm *tm = wxLocaltime_r(&timet, &tmstruct);
 
 
-        wxCHECK_MSG( tm, -1, _T("localtime() failed") );
+        wxCHECK_MSG( tm, -1, _T("wxLocaltime_r() failed") );
 
         return tm->tm_isdst;
     }
 
         return tm->tm_isdst;
     }
@@ -2142,6 +2196,21 @@ wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz, bool noDST)
         secDiff -= 3600;
     }
 
         secDiff -= 3600;
     }
 
+    return Add(wxTimeSpan::Seconds(secDiff));
+}
+
+wxDateTime& wxDateTime::MakeFromTimezone(const TimeZone& tz, bool noDST)
+{
+    long secDiff = GetTimeZone() + tz.GetOffset();
+
+    // we need to know whether DST is or not in effect for this date unless
+    // the test disabled by the caller
+    if ( !noDST && (IsDST() == 1) )
+    {
+        // FIXME we assume that the DST is always shifted by 1 hour
+        secDiff -= 3600;
+    }
+
     return Subtract(wxTimeSpan::Seconds(secDiff));
 }
 
     return Subtract(wxTimeSpan::Seconds(secDiff));
 }
 
@@ -2159,14 +2228,15 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
     if ( (time != (time_t)-1) && !wxStrstr(format, _T("%l")) )
     {
         // use strftime()
     if ( (time != (time_t)-1) && !wxStrstr(format, _T("%l")) )
     {
         // use strftime()
-        tm *tm;
+        struct tm tmstruct;
+        struct tm *tm;
         if ( tz.GetOffset() == -GetTimeZone() )
         {
             // we are working with local time
         if ( tz.GetOffset() == -GetTimeZone() )
         {
             // we are working with local time
-            tm = localtime(&time);
+            tm = wxLocaltime_r(&time, &tmstruct);
 
             // should never happen
 
             // should never happen
-            wxCHECK_MSG( tm, wxEmptyString, _T("localtime() failed") );
+            wxCHECK_MSG( tm, wxEmptyString, _T("wxLocaltime_r() failed") );
         }
         else
         {
         }
         else
         {
@@ -2179,10 +2249,10 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
             if ( time >= 0 )
 #endif
             {
             if ( time >= 0 )
 #endif
             {
-                tm = gmtime(&time);
+                tm = wxGmtime_r(&time, &tmstruct);
 
                 // should never happen
 
                 // should never happen
-                wxCHECK_MSG( tm, wxEmptyString, _T("gmtime() failed") );
+                wxCHECK_MSG( tm, wxEmptyString, _T("wxGmtime_r() failed") );
             }
             else
             {
             }
             else
             {
@@ -2190,7 +2260,7 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
             }
         }
 #ifndef __WXWINCE__
             }
         }
 #ifndef __WXWINCE__
-       //Windows CE doesn't support strftime or wcsftime, so we use the generic implementation
+    //Windows CE doesn't support strftime or wcsftime, so we use the generic implementation
         if ( tm )
         {
             return CallStrftime(format, tm);
         if ( tm )
         {
             return CallStrftime(format, tm);
@@ -2283,12 +2353,12 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
                     // find the YEAR which is a year in the strftime() range (1970
                     // - 2038) whose Jan 1 falls on the same week day as the Jan 1
                     // of the real year. Then make a copy of the format and
                     // find the YEAR which is a year in the strftime() range (1970
                     // - 2038) whose Jan 1 falls on the same week day as the Jan 1
                     // of the real year. Then make a copy of the format and
-                    // replace all occurences of YEAR in it with some unique
+                    // replace all occurrences of YEAR in it with some unique
                     // string not appearing anywhere else in it, then use
                     // strftime() to format the date in year YEAR and then replace
                     // YEAR back by the real year and the unique replacement
                     // string not appearing anywhere else in it, then use
                     // strftime() to format the date in year YEAR and then replace
                     // YEAR back by the real year and the unique replacement
-                    // string back with YEAR. Notice that "all occurences of YEAR"
-                    // means all occurences of 4 digit as well as 2 digit form!
+                    // string back with YEAR. Notice that "all occurrences of YEAR"
+                    // means all occurrences of 4 digit as well as 2 digit form!
                     //
                     // the bugs: we assume that neither of %c nor %x contains any
                     // fields which may change between the YEAR and real year. For
                     //
                     // the bugs: we assume that neither of %c nor %x contains any
                     // fields which may change between the YEAR and real year. For
@@ -2346,25 +2416,25 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
                         strYear.Printf(_T("%d"), year);
                         strYear2.Printf(_T("%d"), year % 100);
 
                         strYear.Printf(_T("%d"), year);
                         strYear2.Printf(_T("%d"), year % 100);
 
-                        // find two strings not occuring in format (this is surely
-                        // not optimal way of doing it... improvements welcome!)
-                        wxString fmt = format;
+                        // find two strings not occurring in format (this is surely
+                        // not the optimal way of doing it... improvements welcome!)
+                        wxString fmt2 = format;
                         wxString replacement = (wxChar)-1;
                         wxString replacement = (wxChar)-1;
-                        while ( fmt.Find(replacement) != wxNOT_FOUND )
+                        while ( fmt2.Find(replacement) != wxNOT_FOUND )
                         {
                             replacement << (wxChar)-1;
                         }
 
                         wxString replacement2 = (wxChar)-2;
                         {
                             replacement << (wxChar)-1;
                         }
 
                         wxString replacement2 = (wxChar)-2;
-                        while ( fmt.Find(replacement) != wxNOT_FOUND )
+                        while ( fmt2.Find(replacement) != wxNOT_FOUND )
                         {
                             replacement << (wxChar)-2;
                         }
 
                         {
                             replacement << (wxChar)-2;
                         }
 
-                        // replace all occurences of year with it
-                        bool wasReplaced = fmt.Replace(strYear, replacement) > 0;
+                        // replace all occurrences of year with it
+                        bool wasReplaced = fmt2.Replace(strYear, replacement) > 0;
                         if ( !wasReplaced )
                         if ( !wasReplaced )
-                            wasReplaced = fmt.Replace(strYear2, replacement2) > 0;
+                            wasReplaced = fmt2.Replace(strYear2, replacement2) > 0;
 
                         // use strftime() to format the same date but in supported
                         // year
 
                         // use strftime() to format the same date but in supported
                         // year
@@ -2388,14 +2458,14 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
                                                                   : _T("%x"),
                                                     &tmAdjusted);
 
                                                                   : _T("%x"),
                                                     &tmAdjusted);
 
-                        // now replace the occurence of 1999 with the real year
+                        // now replace the occurrence of 1999 with the real year
                         wxString strYearReal, strYearReal2;
                         strYearReal.Printf(_T("%04d"), yearReal);
                         strYearReal2.Printf(_T("%02d"), yearReal % 100);
                         str.Replace(strYear, strYearReal);
                         str.Replace(strYear2, strYearReal2);
 
                         wxString strYearReal, strYearReal2;
                         strYearReal.Printf(_T("%04d"), yearReal);
                         strYearReal2.Printf(_T("%02d"), yearReal % 100);
                         str.Replace(strYear, strYearReal);
                         str.Replace(strYear2, strYearReal2);
 
-                        // and replace back all occurences of replacement string
+                        // and replace back all occurrences of replacement string
                         if ( wasReplaced )
                         {
                             str.Replace(replacement2, strYear2);
                         if ( wasReplaced )
                         {
                             str.Replace(replacement2, strYear2);
@@ -2405,9 +2475,9 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
                         res += str;
                     }
 #else
                         res += str;
                     }
 #else
-                                       //Use "%m/%d/%y %H:%M:%S" format instead
-                                       res += wxString::Format(wxT("%02d/%02d/%04d %02d:%02d:%02d"),
-                                                       tm.mon+1,tm.mday, tm.year, tm.hour, tm.min, tm.sec);
+                    //Use "%m/%d/%y %H:%M:%S" format instead
+                    res += wxString::Format(wxT("%02d/%02d/%04d %02d:%02d:%02d"),
+                            tm.mon+1,tm.mday, tm.year, tm.hour, tm.min, tm.sec);
 #endif
                     break;
 
 #endif
                     break;
 
@@ -2448,7 +2518,7 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
 #ifndef __WXWINCE__
                     res += CallStrftime(_T("%p"), &tmTimeOnly);
 #else
 #ifndef __WXWINCE__
                     res += CallStrftime(_T("%p"), &tmTimeOnly);
 #else
-                                       res += (tmTimeOnly.tm_hour > 12) ? wxT("pm") : wxT("am");
+                    res += (tmTimeOnly.tm_hour > 12) ? wxT("pm") : wxT("am");
 #endif
                     break;
 
 #endif
                     break;
 
@@ -2475,7 +2545,7 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
 #ifndef __WXWINCE__
                     res += CallStrftime(_T("%X"), &tmTimeOnly);
 #else
 #ifndef __WXWINCE__
                     res += CallStrftime(_T("%X"), &tmTimeOnly);
 #else
-                                       res += wxString::Format(wxT("%02d:%02d:%02d"),tm.hour, tm.min, tm.sec);
+                    res += wxString::Format(wxT("%02d:%02d:%02d"),tm.hour, tm.min, tm.sec);
 #endif
                     break;
 
 #endif
                     break;
 
@@ -2728,7 +2798,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
     }
 
     // and now the interesting part: the timezone
     }
 
     // and now the interesting part: the timezone
-    int offset;
+    int offset wxDUMMY_INITIALIZE(0);
     if ( *p == _T('-') || *p == _T('+') )
     {
         // the explicit offset given: it has the form of hhmm
     if ( *p == _T('-') || *p == _T('+') )
     {
         // the explicit offset given: it has the form of hhmm
@@ -2740,7 +2810,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
         }
 
         // hours
         }
 
         // hours
-        offset = 60*(10*(*p - _T('0')) + (*(p + 1) - _T('0')));
+        offset = MIN_PER_HOUR*(10*(*p - _T('0')) + (*(p + 1) - _T('0')));
 
         p += 2;
 
 
         p += 2;
 
@@ -2820,68 +2890,174 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date)
         }
 
         // make it minutes
         }
 
         // make it minutes
-        offset *= 60;
+        offset *= MIN_PER_HOUR;
     }
 
     }
 
-    // the spec was correct
+    // the spec was correct, construct the date from the values we found
     Set(day, mon, year, hour, min, sec);
     Set(day, mon, year, hour, min, sec);
-    MakeTimezone((wxDateTime_t)(60*offset));
+    MakeFromTimezone(TimeZone((wxDateTime_t)(offset*SEC_PER_MIN)));
 
     return p;
 }
 
 #ifdef __WINDOWS__
 
     return p;
 }
 
 #ifdef __WINDOWS__
-// Get's current locale's date formatting string and stores it in fmt if
-// the locale is set; otherwise or in case of failure, leaves fmt unchanged
-void GetLocaleDateFormat(wxString *fmt)
+
+// returns the string containing strftime() format used for short dates in the
+// current locale or an empty string
+static wxString GetLocaleDateFormat()
 {
 {
+    wxString fmtWX;
+
+    // there is no setlocale() under Windows CE, so just always query the
+    // system there
+#ifndef __WXWINCE__
     if ( strcmp(setlocale(LC_ALL, NULL), "C") != 0 )
     if ( strcmp(setlocale(LC_ALL, NULL), "C") != 0 )
+#endif
     {
         // The locale was programatically set to non-C. We assume that this was
         // done using wxLocale, in which case thread's current locale is also
         // set to correct LCID value and we can use GetLocaleInfo to determine
         // the correct formatting string:
     {
         // The locale was programatically set to non-C. We assume that this was
         // done using wxLocale, in which case thread's current locale is also
         // set to correct LCID value and we can use GetLocaleInfo to determine
         // the correct formatting string:
+#ifdef __WXWINCE__
+        LCID lcid = LOCALE_USER_DEFAULT;
+#else
         LCID lcid = GetThreadLocale();
         LCID lcid = GetThreadLocale();
-        wxChar delim[5]; // fields deliminer, 4 chars max
-        if ( GetLocaleInfo(lcid, LOCALE_SDATE, delim, 5) )
+#endif
+        // according to MSDN 80 chars is max allowed for short date format
+        wxChar fmt[81];
+        if ( ::GetLocaleInfo(lcid, LOCALE_SSHORTDATE, fmt, WXSIZEOF(fmt)) )
         {
         {
-            wxChar centurybuf[2]; // use %y or %Y, 1 char max
-            wxChar century = 'y';
-            if ( GetLocaleInfo(lcid, LOCALE_ICENTURY, centurybuf, 2) )
+            wxChar chLast = _T('\0');
+            size_t lastCount = 0;
+            for ( const wxChar *p = fmt; /* NUL handled inside */; p++ )
             {
             {
-                if ( centurybuf[0] == _T('1') )
-                    century = 'Y';
-                // else 'y' as above
-            }
-
-            wxChar order[2]; // order code, 1 char max
-            if ( GetLocaleInfo(lcid, LOCALE_IDATE, order, 2) )
-            {
-                if ( order[0] == _T('0') ) // M-D-Y
-                {
-                    *fmt = wxString::Format(_T("%%m%s%%d%s%%%c"),
-                                            delim, delim, century);
-                }
-                else if ( order[0] == _T('1') ) // D-M-Y
-                {
-                    *fmt = wxString::Format(_T("%%d%s%%m%s%%%c"),
-                                            delim, delim, century);
-                }
-                else if ( order[0] == _T('2') ) // Y-M-D
+                if ( *p == chLast )
                 {
                 {
-                    *fmt = wxString::Format(_T("%%%c%s%%m%s%%d"),
-                                            century, delim, delim);
+                    lastCount++;
+                    continue;
                 }
                 }
-                else
+
+                switch ( *p )
                 {
                 {
-                    wxFAIL_MSG(_T("unexpected GetLocaleInfo return value"));
+                    // these characters come in groups, start counting them
+                    case _T('d'):
+                    case _T('M'):
+                    case _T('y'):
+                    case _T('g'):
+                        chLast = *p;
+                        lastCount = 1;
+                        break;
+
+                    default:
+                        // first deal with any special characters we have had
+                        if ( lastCount )
+                        {
+                            switch ( chLast )
+                            {
+                                case _T('d'):
+                                    switch ( lastCount )
+                                    {
+                                        case 1: // d
+                                        case 2: // dd
+                                            // these two are the same as we
+                                            // don't distinguish between 1 and
+                                            // 2 digits for days
+                                            fmtWX += _T("%d");
+                                            break;
+
+                                        case 3: // ddd
+                                            fmtWX += _T("%a");
+                                            break;
+
+                                        case 4: // dddd
+                                            fmtWX += _T("%A");
+                                            break;
+
+                                        default:
+                                            wxFAIL_MSG( _T("too many 'd's") );
+                                    }
+                                    break;
+
+                                case _T('M'):
+                                    switch ( lastCount )
+                                    {
+                                        case 1: // M
+                                        case 2: // MM
+                                            // as for 'd' and 'dd' above
+                                            fmtWX += _T("%m");
+                                            break;
+
+                                        case 3:
+                                            fmtWX += _T("%b");
+                                            break;
+
+                                        case 4:
+                                            fmtWX += _T("%B");
+                                            break;
+
+                                        default:
+                                            wxFAIL_MSG( _T("too many 'M's") );
+                                    }
+                                    break;
+
+                                case _T('y'):
+                                    switch ( lastCount )
+                                    {
+                                        case 1: // y
+                                        case 2: // yy
+                                            fmtWX += _T("%y");
+                                            break;
+
+                                        case 4: // yyyy
+                                            fmtWX += _T("%Y");
+                                            break;
+
+                                        default:
+                                            wxFAIL_MSG( _T("wrong number of 'y's") );
+                                    }
+                                    break;
+
+                                case _T('g'):
+                                    // strftime() doesn't have era string,
+                                    // ignore this format
+                                    wxASSERT_MSG( lastCount <= 2,
+                                                  _T("too many 'g's") );
+                                    break;
+
+                                default:
+                                    wxFAIL_MSG( _T("unreachable") );
+                            }
+
+                            chLast = _T('\0');
+                            lastCount = 0;
+                        }
+
+                        // not a special character so must be just a separator,
+                        // treat as is
+                        if ( *p != _T('\0') )
+                        {
+                            if ( *p == _T('%') )
+                            {
+                                // this one needs to be escaped
+                                fmtWX += _T('%');
+                            }
+
+                            fmtWX += *p;
+                        }
                 }
                 }
+
+                if ( *p == _T('\0') )
+                    break;
             }
         }
             }
         }
-        // if we failed, leave fmtDate value unchanged and
-        // try our luck with the default set above
+        //else: GetLocaleInfo() failed, leave fmtDate value unchanged and
+        //      try our luck with the default formats
     }
     }
+    //else: default C locale, default formats should work
+
+    return fmtWX;
 }
 }
+
 #endif // __WINDOWS__
 
 const wxChar *wxDateTime::ParseFormat(const wxChar *date,
 #endif // __WINDOWS__
 
 const wxChar *wxDateTime::ParseFormat(const wxChar *date,
@@ -3177,6 +3353,7 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
                     hour = tm.hour;
                     min = tm.min;
                 }
                     hour = tm.hour;
                     min = tm.min;
                 }
+                break;
 
             case _T('S'):       // second as a decimal number (00-61)
                 if ( !GetNumericToken(width, input, &num) || (num > 61) )
 
             case _T('S'):       // second as a decimal number (00-61)
                 if ( !GetNumericToken(width, input, &num) || (num > 61) )
@@ -3245,30 +3422,32 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
 
                 {
                     wxDateTime dt;
 
                 {
                     wxDateTime dt;
-
-                    wxString fmtDate, fmtDateAlt;
-
-                    if ( IsWestEuropeanCountry(GetCountry()) ||
-                         GetCountry() == Russia )
-                    {
-                        fmtDate = _T("%d/%m/%y");
-                        fmtDateAlt = _T("%m/%d/%y");
-                    }
-                    else // assume USA
-                    {
-                        fmtDate = _T("%m/%d/%y");
-                        fmtDateAlt = _T("%d/%m/%y");
-                    }
+                    wxString fmtDate,
+                             fmtDateAlt;
 
 #ifdef __WINDOWS__
                     // The above doesn't work for all locales, try to query
                     // Windows for the right way of formatting the date:
 
 #ifdef __WINDOWS__
                     // The above doesn't work for all locales, try to query
                     // Windows for the right way of formatting the date:
-                    GetLocaleDateFormat(&fmtDate);
+                    fmtDate = GetLocaleDateFormat();
+                    if ( fmtDate.empty() )
 #endif
 #endif
+                    {
+                        if ( IsWestEuropeanCountry(GetCountry()) ||
+                             GetCountry() == Russia )
+                        {
+                            fmtDate = _T("%d/%m/%y");
+                            fmtDateAlt = _T("%m/%d/%y");
+                        }
+                        else // assume USA
+                        {
+                            fmtDate = _T("%m/%d/%y");
+                            fmtDateAlt = _T("%d/%m/%y");
+                        }
+                    }
 
                     const wxChar *result = dt.ParseFormat(input, fmtDate);
 
 
                     const wxChar *result = dt.ParseFormat(input, fmtDate);
 
-                    if ( !result )
+                    if ( !result && !fmtDateAlt.empty() )
                     {
                         // ok, be nice and try another one
                         result = dt.ParseFormat(input, fmtDateAlt);
                     {
                         // ok, be nice and try another one
                         result = dt.ParseFormat(input, fmtDateAlt);
@@ -3558,12 +3737,12 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
 
     for ( size_t n = 0; n < WXSIZEOF(literalDates); n++ )
     {
 
     for ( size_t n = 0; n < WXSIZEOF(literalDates); n++ )
     {
-        wxString date = wxGetTranslation(literalDates[n].str);
-        size_t len = date.length();
+        const wxString dateStr = wxGetTranslation(literalDates[n].str);
+        size_t len = dateStr.length();
         if ( wxStrlen(p) >= len )
         {
             wxString str(p, len);
         if ( wxStrlen(p) >= len )
         {
             wxString str(p, len);
-            if ( str.CmpNoCase(date) == 0 )
+            if ( str.CmpNoCase(dateStr) == 0 )
             {
                 // nothing can follow this, so stop here
                 p += len;
             {
                 // nothing can follow this, so stop here
                 p += len;
@@ -4146,7 +4325,7 @@ wxString wxTimeSpan::Format(const wxChar *format) const
 
 #include "wx/arrimpl.cpp"
 
 
 #include "wx/arrimpl.cpp"
 
-WX_DEFINE_OBJARRAY(wxDateTimeArray);
+WX_DEFINE_OBJARRAY(wxDateTimeArray)
 
 static int wxCMPFUNC_CONV
 wxDateTimeCompareFunc(wxDateTime **first, wxDateTime **second)
 
 static int wxCMPFUNC_CONV
 wxDateTimeCompareFunc(wxDateTime **first, wxDateTime **second)
@@ -4188,8 +4367,8 @@ wxDateTimeHolidayAuthority::GetHolidaysInRange(const wxDateTime& dtStart,
 
     holidays.Clear();
 
 
     holidays.Clear();
 
-    size_t count = ms_authorities.size();
-    for ( size_t nAuth = 0; nAuth < count; nAuth++ )
+    const size_t countAuth = ms_authorities.size();
+    for ( size_t nAuth = 0; nAuth < countAuth; nAuth++ )
     {
         ms_authorities[nAuth]->DoGetHolidaysInRange(dtStart, dtEnd, hol);
 
     {
         ms_authorities[nAuth]->DoGetHolidaysInRange(dtStart, dtEnd, hol);