]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datetime.cpp
add wxUSE_DATAVIEWCTRL check to fix a hundred compilation errors
[wxWidgets.git] / src / common / datetime.cpp
index c57875ad35afc6d591caaa045723bf14e40397b7..d1ce06ab39e9f93001afe9ab23efeb098658db2d 100644 (file)
@@ -172,7 +172,22 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringCon
         #define WX_GMTOFF_IN_TM
     #elif defined(__WXWINCE__) && defined(__VISUALC8__)
         // _timezone is not present in dynamic run-time library
-        #if 1
+        #if 0
+        // Solution (1): use the function equivalent of _timezone
+        static long wxGetTimeZone()
+        {
+            static long s_Timezone = MAXLONG; // invalid timezone
+            if (s_Timezone == MAXLONG)
+            {
+                int t;
+                _get_timezone(& t);
+                s_Timezone = (long) t;
+            }
+            return s_Timezone;
+        }
+        #define WX_TIMEZONE wxGetTimeZone()
+        #elif 1
+        // Solution (2): using GetTimeZoneInformation
         static long wxGetTimeZone()
         {
             static long timezone = MAXLONG; // invalid timezone
@@ -186,6 +201,7 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringCon
         }
         #define WX_TIMEZONE wxGetTimeZone()
         #else
+        // Old method using _timezone: this symbol doesn't exist in the dynamic run-time library (i.e. using /MD)
         #define WX_TIMEZONE _timezone
         #endif
     #else // unknown platform - try timezone
@@ -1215,9 +1231,6 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country)
         }
 
         dt += wxTimeSpan::Hours(1);
-
-        // disable DST tests because it could result in an infinite recursion!
-        dt.MakeGMT(true);
     }
     else switch ( country )
     {
@@ -1316,9 +1329,6 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
         }
 
         dt += wxTimeSpan::Hours(1);
-
-        // disable DST tests because it could result in an infinite recursion!
-        dt.MakeGMT(true);
     }
     else switch ( country )
     {
@@ -1597,6 +1607,7 @@ unsigned long wxDateTime::GetAsDOS() const
     time_t ticks = GetTicks();
     struct tm tmstruct;
     struct tm *tm = wxLocaltime_r(&ticks, &tmstruct);
+    wxCHECK_MSG( tm, ULONG_MAX, _T("time can't be represented in DOS format") );
 
     long year = tm->tm_year;
     year -= 80;
@@ -2445,7 +2456,7 @@ wxString wxDateTime::Format(const wxString& format, const TimeZone& tz) const
                     // will change if one of these years is leap and the other one
                     // is not!
                     {
-                        // find the YEAR: normally, for any year X, Jan 1 or the
+                        // find the YEAR: normally, for any year X, Jan 1 of the
                         // year X + 28 is the same weekday as Jan 1 of X (because
                         // the weekday advances by 1 for each normal X and by 2
                         // for each leap X, hence by 5 every 4 years or by 35
@@ -2487,41 +2498,15 @@ wxString wxDateTime::Format(const wxString& format, const TimeZone& tz) const
                             nLostWeekDays += year++ % 4 ? 1 : 2;
                         }
 
-                        // Keep year below 2000 so the 2digit year number
-                        // can never match the month or day of the month
-                        if (year>=2000) year-=28;
-                        // at any rate, we couldn't go further than 1988 + 9 + 28!
-                        wxASSERT_MSG( year < 2030,
-                                      _T("logic error in wxDateTime::Format") );
-
-                        wxString strYear, strYear2;
-                        strYear.Printf(_T("%d"), year);
-                        strYear2.Printf(_T("%d"), year % 100);
+                        // finally move the year below 2000 so that the 2-digit
+                        // year number can never match the month or day of the
+                        // month when we do the replacements below
+                        if ( year >= 2000 )
+                            year -= 28;
 
-                        // find four strings not occurring in format (this is surely
-                        // not the optimal way of doing it... improvements welcome!)
-                        wxString fmt2 = format;
-                        wxString replacement,replacement2,replacement3,replacement4;
-                        for (int rnr=1; rnr<5 ; rnr++)
-                        {
-                            wxString r = (wxChar)-rnr;
-                            while ( fmt2.Find(r) != wxNOT_FOUND )
-                            {
-                                r << (wxChar)-rnr;
-                            }
+                        wxASSERT_MSG( year >= 1970 && year < 2000,
+                                      _T("logic error in wxDateTime::Format") );
 
-                            switch (rnr)
-                            {
-                                case 1: replacement=r; break;
-                                case 2: replacement2=r; break;
-                                case 3: replacement3=r; break;
-                                case 4: replacement4=r; break;
-                            }
-                        }
-                        // replace all occurrences of year with it
-                        bool wasReplaced = fmt2.Replace(strYear, replacement) > 0;
-                        // evaluation order ensures we always attempt the replacement.
-                        wasReplaced = (fmt2.Replace(strYear2, replacement2) > 0) || wasReplaced;
 
                         // use strftime() to format the same date but in supported
                         // year
@@ -2545,25 +2530,23 @@ wxString wxDateTime::Format(const wxString& format, const TimeZone& tz) const
                                                                   : _T("%x"),
                                                     &tmAdjusted);
 
-                        // now replace the occurrence of 1999 with the real year
-                        // we do this in two stages to stop the 2 digit year
-                        // matching any substring of the 4 digit year.
-                        // Any day,month hours and minutes components should be safe due
-                        // to ensuring the range of the years.
-                        wxString strYearReal, strYearReal2;
-                        strYearReal.Printf(_T("%04d"), yearReal);
-                        strYearReal2.Printf(_T("%02d"), yearReal % 100);
-                        str.Replace(strYear, replacement3);
-                        str.Replace(strYear2,replacement4);
-                        str.Replace(replacement3, strYearReal);
-                        str.Replace(replacement4, strYearReal2);
-
-                        // and replace back all occurrences of replacement string
-                        if ( wasReplaced )
-                        {
-                            str.Replace(replacement2, strYear2);
-                            str.Replace(replacement, strYear);
-                        }
+                        // now replace the replacement year with the real year:
+                        // notice that we have to replace the 4 digit year with
+                        // a unique string not appearing in strftime() output
+                        // first to prevent the 2 digit year from matching any
+                        // substring of the 4 digit year (but any day, month,
+                        // hours or minutes components should be safe because
+                        // they are never in 70-99 range)
+                        wxString replacement("|");
+                        while ( str.find(replacement) != wxString::npos )
+                            replacement += '|';
+
+                        str.Replace(wxString::Format("%d", year),
+                                    replacement);
+                        str.Replace(wxString::Format("%d", year % 100),
+                                    wxString::Format("%d", yearReal % 100));
+                        str.Replace(replacement,
+                                    wxString::Format("%d", yearReal));
 
                         res += str;
                     }
@@ -3819,7 +3802,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
     // some special cases
     static struct
     {
-        const wxChar *str;
+        const char *str;
         int dayDiffFromToday;
     } literalDates[] =
     {
@@ -3994,7 +3977,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
                 else // not a valid weekday name
                 {
                     // try the ordinals
-                    static const wxChar *ordinals[] =
+                    static const char *ordinals[] =
                     {
                         wxTRANSLATE("first"),
                         wxTRANSLATE("second"),
@@ -4160,7 +4143,7 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time)
     // first try some extra things
     static const struct
     {
-        const wxChar *name;
+        const char *name;
         wxDateTime_t  hour;
     } stdTimes[] =
     {