X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/71ebd60b06f0c299b3f6ae3b11a8dcb4b0306493..e2cb366f612460ba70fb12560c112fef2d8389dd:/include/wx/datetime.h diff --git a/include/wx/datetime.h b/include/wx/datetime.h index 1c337df30a..6e4341618a 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -17,11 +17,11 @@ #if wxUSE_DATETIME -#ifndef __WXWINCE__ -#include -#else -#include "wx/msw/wince/time.h" -#endif +#ifdef __WXWINCE__ + #include "wx/msw/wince/time.h" +#elif !defined(__WXPALMOS5__) + #include +#endif // OS #include // for INT_MIN @@ -30,6 +30,9 @@ class WXDLLIMPEXP_FWD_BASE wxDateTime; class WXDLLIMPEXP_FWD_BASE wxTimeSpan; class WXDLLIMPEXP_FWD_BASE wxDateSpan; +#ifdef __WXMSW__ +struct _SYSTEMTIME; +#endif #include "wx/dynarray.h" @@ -598,6 +601,12 @@ public: wxDateTime_t minute = 0, wxDateTime_t second = 0, wxDateTime_t millisec = 0); +#ifdef __WXMSW__ + wxDateTime(const struct _SYSTEMTIME& st) + { + SetFromMSWSysTime(st); + } +#endif // default copy ctor ok @@ -697,7 +706,7 @@ public: 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()) @@ -912,6 +921,17 @@ public: // pack the date in DOS format unsigned long GetAsDOS() const; + // SYSTEMTIME format + // ------------------------------------------------------------------------ +#ifdef __WXMSW__ + + // convert SYSTEMTIME to wxDateTime + wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME&); + + // convert wxDateTime to SYSTEMTIME + void GetAsMSWSysTime(struct _SYSTEMTIME*) const; +#endif // __WXMSW__ + // comparison (see also functions below for operator versions) // ------------------------------------------------------------------------ @@ -1068,22 +1088,39 @@ public: // 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); } @@ -1109,12 +1146,36 @@ public: } const char *ParseFormat(const char *date, - const wxString& format = wxDefaultDateTimeFormat, + const wxString& format = "%c", const wxDateTime& dateDef = wxDefaultDateTime) { return ParseFormat(wxString(date), format, dateDef); } + + // parse a string containing date, time or both in ISO 8601 format + // + // notice that these functions are new in wx 3.0 and so we don't + // provide compatibility overloads for them + bool ParseISODate(const wxString& date) + { + wxString::const_iterator end; + return ParseFormat(date, wxS("%Y-%m-%d"), &end) && end == date.end(); + } + + bool ParseISOTime(const wxString& time) + { + wxString::const_iterator end; + return ParseFormat(time, wxS("%H:%M:%S"), &end) && end == time.end(); + } + + bool ParseISOCombined(const wxString& datetime, char sep = 'T') + { + wxString::const_iterator end; + const wxString fmt = wxS("%Y-%m-%d") + wxString(sep) + wxS("%H:%M:%S"); + return ParseFormat(datetime, fmt, &end) && end == datetime.end(); + } + // parse a string containing the date/time in "free" format, this // function will try to make an educated guess at the string contents const char *ParseDateTime(const wxString& datetime, @@ -1184,15 +1245,20 @@ public: wxString Format(const wxString& format = wxDefaultDateTimeFormat, const TimeZone& tz = Local) const; // preferred date representation for the current locale - wxString FormatDate() const { return Format(_T("%x")); } + wxString FormatDate() const { return Format(wxS("%x")); } // preferred time representation for the current locale - wxString FormatTime() const { return Format(_T("%X")); } + wxString FormatTime() const { return Format(wxS("%X")); } // returns the string representing the date in ISO 8601 format // (YYYY-MM-DD) - wxString FormatISODate() const { return Format(_T("%Y-%m-%d")); } + wxString FormatISODate() const { return Format(wxS("%Y-%m-%d")); } // returns the string representing the time in ISO 8601 format // (HH:MM:SS) - wxString FormatISOTime() const { return Format(_T("%H:%M:%S")); } + wxString FormatISOTime() const { return Format(wxS("%H:%M:%S")); } + // return the combined date time representation in ISO 8601 format; the + // separator character should be 'T' according to the standard but it + // can also be useful to set it to ' ' + wxString FormatISOCombined(char sep = 'T') const + { return FormatISODate() + sep + FormatISOTime(); } // implementation // ------------------------------------------------------------------------ @@ -1204,7 +1270,7 @@ public: 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() @@ -1378,7 +1444,7 @@ public: // compare two timestamps: works with the absolute values, i.e. 1 // hour is shorter than -2 hours. Also, it will return false if the // timespans are equal in absolute value. - bool IsShorterThan(const wxTimeSpan& t) const { return !IsLongerThan(t); } + bool IsShorterThan(const wxTimeSpan& t) const; inline bool operator<(const wxTimeSpan &ts) const { @@ -2148,6 +2214,11 @@ inline bool wxTimeSpan::IsLongerThan(const wxTimeSpan& ts) const return GetValue().Abs() > ts.GetValue().Abs(); } +inline bool wxTimeSpan::IsShorterThan(const wxTimeSpan& ts) const +{ + return GetValue().Abs() < ts.GetValue().Abs(); +} + // ---------------------------------------------------------------------------- // wxDateSpan // ----------------------------------------------------------------------------