X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b667edaecd6cac9a6069f2d5f091fcc09239614d..51146826fc0a0a949d88f23fb9d83fc1f1ada14e:/src/common/datetime.cpp diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 2697859c64..d1ce06ab39 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -1231,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 ) { @@ -1332,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 ) { @@ -1613,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; @@ -2461,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 @@ -2503,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 @@ -2561,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; } @@ -3835,7 +3802,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date) // some special cases static struct { - const wxChar *str; + const char *str; int dayDiffFromToday; } literalDates[] = { @@ -4010,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"), @@ -4176,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[] = {