X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77b88df26f37fef4b310d35eaae0f7974086ae12..74124ea96161da28a76df576e410c3437ac58272:/src/common/datetime.cpp diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 9ef9b72690..caf8b036ce 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -77,6 +77,12 @@ #include +#ifdef __WINDOWS__ + #include "wx/msw/wrapwin.h" + #include + #include +#endif + #include "wx/datetime.h" #include "wx/stopwatch.h" // for wxGetLocalTimeMillis() @@ -120,7 +126,9 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter , wxFromStringCon #endif #if !defined(WX_TIMEZONE) && !defined(WX_GMTOFF_IN_TM) - #if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__) + #if defined(__WXPALMOS__) + #define WX_GMTOFF_IN_TM + #elif defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__) #define WX_TIMEZONE _timezone #elif defined(__MWERKS__) long wxmw_timezone = 28800; @@ -1283,18 +1291,21 @@ wxDateTime& wxDateTime::Set(wxDateTime_t hour, wxDATETIME_CHECK( tm, _T("localtime() failed") ); + // make a copy so it isn't clobbered by the call to mktime() below + struct tm tm1(*tm); + // adjust the time - tm->tm_hour = hour; - tm->tm_min = minute; - tm->tm_sec = second; + tm1.tm_hour = hour; + tm1.tm_min = minute; + tm1.tm_sec = second; // and the DST in case it changes on this date - struct tm tm2(*tm); + struct tm tm2(tm1); mktime(&tm2); - if ( tm2.tm_isdst != tm->tm_isdst ) - tm->tm_isdst = tm2.tm_isdst; + if ( tm2.tm_isdst != tm1.tm_isdst ) + tm1.tm_isdst = tm2.tm_isdst; - (void)Set(*tm); + (void)Set(tm1); // and finally adjust milliseconds return SetMillisecond(millisec); @@ -2822,6 +2833,60 @@ const wxChar *wxDateTime::ParseRfc822Date(const wxChar* date) return p; } +#ifdef __WINDOWS__ +// Get's current locale's date formatting string and stores it in fmt if +// the locale is set; otherwise or in case of failure, leaves fmt unchanged +void GetLocaleDateFormat(wxString *fmt) +{ + if ( strcmp(setlocale(LC_ALL, NULL), "C") != 0 ) + { + // The locale was programatically set to non-C. We assume that this was + // done using wxLocale, in which case thread's current locale is also + // set to correct LCID value and we can use GetLocaleInfo to determine + // the correct formatting string: + LCID lcid = GetThreadLocale(); + wxChar delim[5]; // fields deliminer, 4 chars max + if ( GetLocaleInfo(lcid, LOCALE_SDATE, delim, 5) ) + { + wxChar centurybuf[2]; // use %y or %Y, 1 char max + wxChar century = 'y'; + if ( GetLocaleInfo(lcid, LOCALE_ICENTURY, centurybuf, 2) ) + { + if ( centurybuf[0] == _T('1') ) + century = 'Y'; + // else 'y' as above + } + + wxChar order[2]; // order code, 1 char max + if ( GetLocaleInfo(lcid, LOCALE_IDATE, order, 2) ) + { + if ( order[0] == _T('0') ) // M-D-Y + { + *fmt = wxString::Format(_T("%%m%s%%d%s%%%c"), + delim, delim, century); + } + else if ( order[0] == _T('1') ) // D-M-Y + { + *fmt = wxString::Format(_T("%%d%s%%m%s%%%c"), + delim, delim, century); + } + else if ( order[0] == _T('2') ) // Y-M-D + { + *fmt = wxString::Format(_T("%%%c%s%%m%s%%d"), + century, delim, delim); + } + else + { + wxFAIL_MSG(_T("unexpected GetLocaleInfo return value")); + } + } + } + // if we failed, leave fmtDate value unchanged and + // try our luck with the default set above + } +} +#endif // __WINDOWS__ + const wxChar *wxDateTime::ParseFormat(const wxChar *date, const wxChar *format, const wxDateTime& dateDef) @@ -3181,11 +3246,11 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, } #endif // HAVE_STRPTIME - // TODO query the LOCALE_IDATE setting under Win32 { wxDateTime dt; wxString fmtDate, fmtDateAlt; + if ( IsWestEuropeanCountry(GetCountry()) || GetCountry() == Russia ) { @@ -3198,6 +3263,12 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date, fmtDateAlt = _T("%d/%m/%y"); } +#ifdef __WINDOWS__ + // The above doesn't work for all locales, try to query + // Windows for the right way of formatting the date: + GetLocaleDateFormat(&fmtDate); +#endif + const wxChar *result = dt.ParseFormat(input, fmtDate); if ( !result ) @@ -3563,14 +3634,14 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date) } else // may be either day or year { - wxDateTime_t maxDays = (wxDateTime_t)( + wxDateTime_t max_days = (wxDateTime_t)( haveMon ? GetNumOfDaysInMonth(haveYear ? year : Inv_Year, mon) : 31 ); // can it be day? - if ( (val == 0) || (val > (unsigned long)maxDays) ) + if ( (val == 0) || (val > (unsigned long)max_days) ) { // no isYear = true;