#define wxInvalidDateTime wxDefaultDateTime
+
+// ----------------------------------------------------------------------------
+// conditional compilation
+// ----------------------------------------------------------------------------
+
+#if defined(HAVE_STRPTIME) && defined(__GLIBC__) && \
+ ((__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0))
+ // glibc 2.0.7 strptime() is broken - the following snippet causes it to
+ // crash (instead of just failing):
+ //
+ // strncpy(buf, "Tue Dec 21 20:25:40 1999", 128);
+ // strptime(buf, "%x", &tm);
+ //
+ // so don't use it
+ #undef HAVE_STRPTIME
+#endif // broken strptime()
+
+#if defined(HAVE_STRPTIME) && defined(__DARWIN__) && defined(_MSL_USING_MW_C_HEADERS) && _MSL_USING_MW_C_HEADERS
+ // configure detects strptime as linkable because it's in the OS X
+ // System library but MSL headers don't declare it.
+
+// char *strptime(const char *, const char *, struct tm *);
+ // However, we DON'T want to just provide it here because we would
+ // crash and/or overwrite data when strptime from OS X tries
+ // to fill in MW's struct tm which is two fields shorter (no TZ stuff)
+ // So for now let's just say we don't have strptime
+ #undef HAVE_STRPTIME
+#endif
+
+// everyone has strftime except Win CE unless VC8 is used
+#if !defined(__WXWINCE__) || defined(__VISUALC8__)
+ #define HAVE_STRFTIME
+#endif
+
// ----------------------------------------------------------------------------
// wxDateTime represents an absolute moment in the time
// ----------------------------------------------------------------------------
// adoption of the Gregorian calendar (see IsGregorian())
//
// All data and comments taken verbatim from "The Calendar FAQ (v 2.0)"
- // by Claus Tøndering, http://www.pip.dknet.dk/~c-t/calendar.html
+ // by Claus T�ndering, http://www.pip.dknet.dk/~c-t/calendar.html
// except for the comments "we take".
//
// Symbol "->" should be read as "was followed by" in the comments
wxDateTime& SetToPrevWeekDay(WeekDay weekday);
inline wxDateTime GetPrevWeekDay(WeekDay weekday) const;
- // set to Nth occurence of given weekday in the given month of the
+ // set to Nth occurrence of given weekday in the given month of the
// given year (time is set to 0), return true on success and false on
// failure. n may be positive (1..5) or negative to count from the end
// of the month (see helper function SetToLastWeekDay())
// the missing (in the string) fields with the values of dateDef (by
// default, they will not change if they had valid values or will
// default to Today() otherwise)
+
+ // notice that we unfortunately need all those overloads because we use
+ // the type of the date string to select the return value of the
+ // function: it's wchar_t if a wide string is passed for compatibility
+ // with the code doing "const wxChar *p = dt.ParseFormat(_T("..."))",
+ // but char* in all other cases for compatibility with ANSI build which
+ // allowed code like "const char *p = dt.ParseFormat("...")"
+ //
+ // so we need wchar_t overload and now passing s.c_str() as first
+ // argument is ambiguous because it's convertible to both wxString and
+ // wchar_t* and now it's passing char* which becomes ambiguous as it is
+ // convertible to both wxString and wxCStrData hence we need char*
+ // overload too
+ //
+ // and to make our life more miserable we also pay for having the
+ // optional dateDef parameter: as it's almost never used, we want to
+ // allow people to omit it when specifying the end iterator output
+ // parameter but we still have to allow specifying dateDef too, so we
+ // need another overload for this
+ //
+ // FIXME: all this mess could be avoided by using some class similar to
+ // wxFormatString, i.e. remembering string [pointer] of any type
+ // and convertible to either char* or wchar_t* as wxCStrData and
+ // having only 1 (or 2, because of the last paragraph above)
+ // overload taking it, see #9560
const char *ParseFormat(const wxString& date,
const wxString& format = wxDefaultDateTimeFormat,
const wxDateTime& dateDef = wxDefaultDateTime,
wxString::const_iterator *end = NULL);
const char *ParseFormat(const wxString& date,
- const char *format = wxDefaultDateTimeFormat,
- const wxDateTime& dateDef = wxDefaultDateTime,
- wxString::const_iterator *end = NULL)
- {
- return ParseFormat(date, wxString(format), dateDef, end);
- }
-
- const char *ParseFormat(const wxString& date,
- const wxString& format = wxDefaultDateTimeFormat,
- wxString::const_iterator *end = NULL)
+ const wxString& format,
+ wxString::const_iterator *end)
{
return ParseFormat(date, format, wxDefaultDateTime, end);
}
return ParseFormat(wxString(date), format, dateDef);
}
- const char *ParseFormat(const char *date,
- const char *format = wxDefaultDateTimeFormat,
- const wxDateTime& dateDef = wxDefaultDateTime)
- {
- return ParseFormat(wxString(date), wxString(format), dateDef);
- }
// parse a string containing date, time or both in ISO 8601 format
//
inline wxLongLong GetValue() const;
// a helper function to get the current time_t
- static time_t GetTimeNow() { return time((time_t *)NULL); }
+ static time_t GetTimeNow() { return time(NULL); }
// another one to get the current time broken down
static struct tm *GetTmNow()