X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad0dc53bffdcc40f0b8528c30927d6ebc1fe9cbd..487c1f7ef2ad59cf8ed6d8aca317d20304ca27bd:/src/common/datetime.cpp diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 8685319432..8ca53f3b25 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -584,7 +584,6 @@ wxDateTime::Month wxDateTime::GetCurrentMonth(wxDateTime::Calendar cal) { case Gregorian: return Now().GetMonth(); - break; case Julian: wxFAIL_MSG(_T("TODO")); @@ -612,7 +611,6 @@ wxDateTime::wxDateTime_t wxDateTime::GetNumberOfDays(int year, Calendar cal) case Gregorian: case Julian: return IsLeapYear(year) ? 366 : 365; - break; default: wxFAIL_MSG(_T("unsupported calendar")); @@ -835,7 +833,8 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country) dt += wxTimeSpan::Hours(1); - dt.MakeGMT(); + // disable DST tests because it could result in an infinite recursion! + dt.MakeGMT(TRUE); } else switch ( country ) { @@ -935,7 +934,8 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country) dt += wxTimeSpan::Hours(1); - dt.MakeGMT(); + // disable DST tests because it could result in an infinite recursion! + dt.MakeGMT(TRUE); } else switch ( country ) { @@ -1117,7 +1117,7 @@ wxDateTime& wxDateTime::Set(double jdn) jdn *= MILLISECONDS_PER_DAY; - m_time = jdn; + m_time.Assign(jdn); return *this; } @@ -1507,7 +1507,7 @@ wxDateTime::wxDateTime_t wxDateTime::GetDayOfYear(const TimeZone& tz) const wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const { -#if 0 +#if 1 // the first week of the year is the one which contains Jan, 4 (according // to ISO standard rule), so the year day N0 = 4 + 7*W always lies in the // week W+1. As any day N = 7*W + 4 + (N - 4)%7, it lies in the same week @@ -1529,8 +1529,9 @@ wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const } return week; -#else // this seems to be a bit simpler and I believe is also correct - return (WeekDay)((GetDayOfYear() - (GetWeekDay() - 1 + 7) % 7 + 7) / 7); +#else // 0 + // an attempt at doing it simpler - but this doesn't quite work... + return (WeekDay)((GetDayOfYear(tz) - (GetWeekDay(tz) - 1 + 7) % 7 + 7) / 7); #endif // 0/1 } @@ -1630,12 +1631,13 @@ int wxDateTime::IsDST(wxDateTime::Country country) const } } -wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz) +wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz, bool noDST) { int secDiff = GetTimeZone() + tz.GetOffset(); - // we need to know whether DST is or not in effect for this date - if ( IsDST() == 1 ) + // 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; @@ -1673,10 +1675,10 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const time += tz.GetOffset(); #ifdef __VMS__ /* time is unsigned so VMS gives a warning on the original */ - time2 = (int) time; - if ( time2 >= 0 ) + time2 = (int) time; + if ( time2 >= 0 ) #else - if ( time >= 0 ) + if ( time >= 0 ) #endif { tm = gmtime(&time); @@ -2196,7 +2198,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date) } // and now the interesting part: the timezone - wxDateTime_t offset; + int offset; if ( *p == _T('-') || *p == _T('+') ) { // the explicit offset given: it has the form of hhmm @@ -2293,7 +2295,7 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date) // the spec was correct Set(day, mon, year, hour, min, sec); - MakeTimezone(60*offset); + MakeTimezone((wxDateTime_t)(60*offset)); return p; } @@ -2397,7 +2399,7 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, // this is the format which corresponds to ctime() output // and strptime("%c") should parse it, so try it first - static const wxChar *fmtCtime = _T("%a %b %e %H:%M:%S %Y"); + static const wxChar *fmtCtime = _T("%a %b %d %H:%M:%S %Y"); const wxChar *result = dt.ParseFormat(input, fmtCtime); if ( !result ) @@ -2623,18 +2625,27 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, { wxDateTime dt; - wxString fmtDate; + 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"); } const wxChar *result = dt.ParseFormat(input, fmtDate); + + if ( !result ) + { + // ok, be nice and try another one + result = dt.ParseFormat(input, fmtDateAlt); + } + if ( !result ) { // bad luck