X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ca3e85cfa8bec43f148eb1db520ab125947bf1e7..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/common/datetime.cpp diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 5f7f6931e2..4f1f73550a 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -66,19 +66,22 @@ #if !defined(wxUSE_DATETIME) || wxUSE_DATETIME #ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" + #endif #include "wx/string.h" #include "wx/log.h" + #include "wx/intl.h" + #include "wx/stopwatch.h" // for wxGetLocalTimeMillis() + #include "wx/module.h" #endif // WX_PRECOMP -#include "wx/intl.h" #include "wx/thread.h" #include "wx/tokenzr.h" -#include "wx/module.h" #include #ifdef __WINDOWS__ - #include "wx/msw/wrapwin.h" #include #ifndef __WXWINCE__ #include @@ -86,7 +89,6 @@ #endif #include "wx/datetime.h" -#include "wx/stopwatch.h" // for wxGetLocalTimeMillis() const long wxDateTime::TIME_T_FACTOR = 1000l; @@ -327,7 +329,6 @@ wxDateTime::wxDateTime_t GetNumOfDaysInMonth(int year, wxDateTime::Month month) // (in seconds) static int GetTimeZone() { -#ifdef WX_GMTOFF_IN_TM // set to true when the timezone is set static bool s_timezoneSet = false; static long gmtoffset = LONG_MAX; // invalid timezone @@ -338,22 +339,22 @@ static int GetTimeZone() // just call wxLocaltime_r() instead of figuring out whether this // system supports tzset(), _tzset() or something else time_t t = 0; - struct tm *tm; - struct tm tmstruct; + struct tm tm; - tm = wxLocaltime_r(&t, &tmstruct); + wxLocaltime_r(&t, &tm); s_timezoneSet = true; +#ifdef WX_GMTOFF_IN_TM // note that GMT offset is the opposite of time zone and so to return // consistent results in both WX_GMTOFF_IN_TM and !WX_GMTOFF_IN_TM // cases we have to negate it - gmtoffset = -tm->tm_gmtoff; + gmtoffset = -tm.tm_gmtoff; +#else // !WX_GMTOFF_IN_TM + gmtoffset = WX_TIMEZONE; +#endif // WX_GMTOFF_IN_TM/!WX_GMTOFF_IN_TM } return (int)gmtoffset; -#else // !WX_GMTOFF_IN_TM - return (int)WX_TIMEZONE; -#endif // WX_GMTOFF_IN_TM/!WX_GMTOFF_IN_TM } // return the integral part of the JDN for the midnight of the given date (to @@ -720,6 +721,7 @@ wxDateTime::TimeZone::TimeZone(wxDateTime::TZ tz) case wxDateTime::GMT10: case wxDateTime::GMT11: case wxDateTime::GMT12: + case wxDateTime::GMT13: m_offset = 3600*(tz - wxDateTime::GMT0); break; @@ -2404,40 +2406,42 @@ wxString wxDateTime::Format(const wxChar *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; + + // 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; + wxString strYear, strYear2; strYear.Printf(_T("%d"), year); strYear2.Printf(_T("%d"), year % 100); - + // 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; - } - - switch (rnr) { - case 1: replacement=r; break; - case 2: replacement2=r; break; - case 3: replacement3=r; break; - case 4: replacement4=r; break; - } - } + 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; + } + + 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 ; + wasReplaced = (fmt2.Replace(strYear2, replacement2) > 0) | wasReplaced ; // use strftime() to format the same date but in supported // year @@ -2462,10 +2466,10 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const &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. + // 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); @@ -4233,11 +4237,14 @@ wxString wxTimeSpan::Format(const wxChar *format) const if ( ch == _T('%') ) { // the start of the format specification of the printf() below - wxString fmtPrefix = _T('%'); + wxString fmtPrefix(_T('%')); // the number long n; + // the number of digits for the format string, 0 if unused + unsigned digits = 0; + ch = *++pch; // get the format spec char switch ( ch ) { @@ -4272,6 +4279,13 @@ wxString wxTimeSpan::Format(const wxChar *format) const n = GetHours(); if ( partBiggest < Part_Hour ) { + if ( n < 0 ) + { + // the sign has already been taken into account + // when outputting the biggest part + n = -n; + } + n %= HOURS_PER_DAY; } else @@ -4279,25 +4293,31 @@ wxString wxTimeSpan::Format(const wxChar *format) const partBiggest = Part_Hour; } - fmtPrefix += _T("02"); + digits = 2; break; case _T('l'): n = GetMilliseconds().ToLong(); if ( partBiggest < Part_MSec ) { + if ( n < 0 ) + n = -n; + n %= 1000; } //else: no need to reset partBiggest to Part_MSec, it is // the least significant one anyhow - fmtPrefix += _T("03"); + digits = 3; break; case _T('M'): n = GetMinutes(); if ( partBiggest < Part_Min ) { + if ( n < 0 ) + n = -n; + n %= MIN_PER_HOUR; } else @@ -4305,13 +4325,16 @@ wxString wxTimeSpan::Format(const wxChar *format) const partBiggest = Part_Min; } - fmtPrefix += _T("02"); + digits = 2; break; case _T('S'): n = GetSeconds().ToLong(); if ( partBiggest < Part_Sec ) { + if ( n < 0 ) + n = -n; + n %= SEC_PER_MIN; } else @@ -4319,10 +4342,19 @@ wxString wxTimeSpan::Format(const wxChar *format) const partBiggest = Part_Sec; } - fmtPrefix += _T("02"); + digits = 2; break; } + if ( digits ) + { + // negative numbers need one extra position for '-' display + if ( n < 0 ) + digits++; + + fmtPrefix << _T("0") << digits; + } + str += wxString::Format(fmtPrefix + _T("ld"), n); } else