X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c3302e7e295593f89b6e355c921c9e16d8826d0f..4a28b9b81cafbf10b32dacbdc4fe98944e3ff6c6:/src/common/datetime.cpp diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index c04f928cee..1f3ba66047 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -63,12 +63,14 @@ #pragma hdrstop #endif +#if !defined(wxUSE_DATETIME) || wxUSE_DATETIME + #ifndef WX_PRECOMP #include "wx/string.h" - #include "wx/intl.h" #include "wx/log.h" #endif // WX_PRECOMP +#include "wx/intl.h" #include "wx/thread.h" #include "wx/tokenzr.h" #include "wx/module.h" @@ -95,16 +97,33 @@ #undef HAVE_STRPTIME #endif // broken strptime() -#ifndef WX_TIMEZONE +#if !defined(WX_TIMEZONE) && !defined(WX_GMTOFF_IN_TM) #if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__) #define WX_TIMEZONE _timezone #elif defined(__MWERKS__) long wxmw_timezone = 28800; - #define WX_TIMEZONE wxmw_timezone; + #define WX_TIMEZONE wxmw_timezone + #elif defined(__DJGPP__) + #include + #include + static long wxGetTimeZone() + { + static long timezone = MAXLONG; // invalid timezone + if (timezone == MAXLONG) + { + struct timeb tb; + ftime(&tb); + timezone = tb.timezone; + } + return timezone; + } + #define WX_TIMEZONE wxGetTimeZone() + #elif defined(__DARWIN__) + #define WX_GMTOFF_IN_TM #else // unknown platform - try timezone #define WX_TIMEZONE timezone #endif -#endif // !WX_TIMEZONE +#endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM // ---------------------------------------------------------------------------- // macros @@ -194,10 +213,7 @@ static const wxDateTime::wxDateTime_t gs_cumulatedDays[2][MONTHS_IN_YEAR] = // in the fine tradition of ANSI C we use our equivalent of (time_t)-1 to // indicate an invalid wxDateTime object - -static const wxDateTime gs_dtDefault; - -const wxDateTime& wxDefaultDateTime = gs_dtDefault; +const wxDateTime wxDefaultDateTime; wxDateTime::Country wxDateTime::ms_country = wxDateTime::Country_Unknown; @@ -247,20 +263,31 @@ static int GetTimeZone() { // set to TRUE when the timezone is set static bool s_timezoneSet = FALSE; - +#ifdef WX_GMTOFF_IN_TM + static long gmtoffset = LONG_MAX; // invalid timezone +#endif + wxCRIT_SECT_LOCKER(lock, gs_critsectTimezone); if ( !s_timezoneSet ) { // just call localtime() instead of figuring out whether this system // supports tzset(), _tzset() or something else - time_t t = 0; + time_t t = 0; + struct tm *tm; - (void)localtime(&t); + tm = localtime(&t); s_timezoneSet = TRUE; +#ifdef WX_GMTOFF_IN_TM + gmtoffset = tm->tm_gmtoff; +#endif } +#ifdef WX_GMTOFF_IN_TM + return (int)gmtoffset; +#else return (int)WX_TIMEZONE; +#endif } // return the integral part of the JDN for the midnight of the given date (to @@ -1330,8 +1357,6 @@ wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const // check that the algorithm gave us something reasonable wxASSERT_MSG( (0 < month) && (month <= 12), _T("invalid month") ); wxASSERT_MSG( (1 <= day) && (day < 32), _T("invalid day") ); - wxASSERT_MSG( (INT_MIN <= year) && (year <= INT_MAX), - _T("year range overflow") ); // construct Tm from these values Tm tm; @@ -1876,6 +1901,10 @@ wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const fmt = _T("%03d"); break; + case _T('w'): // week day as number has only one + fmt = _T("%d"); + break; + default: // it's either another valid format specifier in which case // the format is "%02d" (for all the rest) or we have the @@ -2519,6 +2548,30 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, width += *fmt - _T('0'); } + // the default widths for the various fields + if ( !width ) + { + switch ( *fmt ) + { + case _T('Y'): // year has 4 digits + width = 4; + break; + + case _T('j'): // day of year has 3 digits + case _T('l'): // milliseconds have 3 digits + width = 3; + break; + + case _T('w'): // week day as number has only one + width = 1; + break; + + default: + // default for all other fields + width = 2; + } + } + // then the format itself switch ( *fmt ) { @@ -3373,8 +3426,12 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time) } } - // try all time formats we may think about starting with the standard one - const wxChar *result = ParseFormat(time, _T("%X")); + // try all time formats we may think about in the order from longest to + // shortest + + // 12hour with AM/PM? + const wxChar *result = ParseFormat(time, _T("%I:%M:%S %p")); + if ( !result ) { // normally, it's the same, but why not try it? @@ -3383,8 +3440,8 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time) if ( !result ) { - // 12hour with AM/PM? - result = ParseFormat(time, _T("%I:%M:%S %p")); + // 12hour with AM/PM but without seconds? + result = ParseFormat(time, _T("%I:%M %p")); } if ( !result ) @@ -3395,8 +3452,8 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time) if ( !result ) { - // 12hour with AM/PM but without seconds? - result = ParseFormat(time, _T("%I:%M %p")); + // just the hour and AM/PM? + result = ParseFormat(time, _T("%I %p")); } if ( !result ) @@ -3407,8 +3464,9 @@ const wxChar *wxDateTime::ParseTime(const wxChar *time) if ( !result ) { - // just the hour and AM/PM? - result = ParseFormat(time, _T("%I %p")); + // parse the standard format: normally it is one of the formats above + // but it may be set to something completely different by the user + result = ParseFormat(time, _T("%X")); } // TODO: parse timezones @@ -3429,6 +3487,19 @@ bool wxDateTime::IsWorkDay(Country WXUNUSED(country)) const // wxTimeSpan // ============================================================================ +// this enum is only used in wxTimeSpan::Format() below but we can't declare +// it locally to the method as it provokes an internal compiler error in egcs +// 2.91.60 when building with -O2 +enum TimeSpanPart +{ + Part_Week, + Part_Day, + Part_Hour, + Part_Min, + Part_Sec, + Part_MSec +}; + // not all strftime(3) format specifiers make sense here because, for example, // a time span doesn't have a year nor a timezone // @@ -3466,15 +3537,7 @@ wxString wxTimeSpan::Format(const wxChar *format) const // should use GetMinutes() % 60, otherwise just GetMinutes() &c // we remember the most important unit found so far - enum TimeSpanPart - { - Part_Week, - Part_Day, - Part_Hour, - Part_Min, - Part_Sec, - Part_MSec - } partBiggest = Part_MSec; + TimeSpanPart partBiggest = Part_MSec; for ( const wxChar *pch = format; *pch; pch++ ) { @@ -3703,4 +3766,4 @@ size_t wxDateTimeWorkDays::DoGetHolidaysInRange(const wxDateTime& dtStart, return holidays.GetCount(); } - +#endif // wxUSE_DATETIME