added wxDateTime::FormatISOCombined() and ParseISODate/Time/Combined()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51516 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -194,6 +194,7 @@ All:
|
||||
- Use UTF-8 for Unicode data in wxIPC classes (Anders Larsen)
|
||||
- Added support for user-defined types to wxConfig (Marcin Wojdyr).
|
||||
- Added wxJoin() and wxSplit() functions (Francesco Montorsi).
|
||||
- Added wxDateTime::FormatISOCombined() and ParseISODate/Time/Combined()
|
||||
- Added wxMutex::LockTimeout() (Aleksandr Napylov).
|
||||
- Added wxMemoryInputStream(wxInputStream&) ctor (Stas Sergeev).
|
||||
- Implemented wxMemoryInputStream::CanRead().
|
||||
|
@@ -331,9 +331,10 @@ date and time representations for the current locale (
|
||||
\helpref{FormatDate}{wxdatetimeformatdate} and
|
||||
\helpref{FormatTime}{wxdatetimeformattime}), using the international standard
|
||||
representation defined by ISO 8601 (
|
||||
\helpref{FormatISODate}{wxdatetimeformatisodate} and
|
||||
\helpref{FormatISOTime}{wxdatetimeformatisotime}) or by specifying any format
|
||||
at all and using \helpref{Format}{wxdatetimeformat} directly.
|
||||
\helpref{FormatISODate}{wxdatetimeformatisodate},
|
||||
\helpref{FormatISOTime}{wxdatetimeformatisotime} and
|
||||
\helpref{FormatISOCombined}{wxdatetimeformatisocombined}) or by specifying any
|
||||
format at all and using \helpref{Format}{wxdatetimeformat} directly.
|
||||
|
||||
The conversions from text are more interesting, as there are much more
|
||||
possibilities to care about. The simplest cases can be taken care of with
|
||||
@@ -363,14 +364,18 @@ char pointer is also returned for backwards compatibility but there is also an
|
||||
additional argument of wxString::const\_iterator type in which, if it is not
|
||||
\NULL, an iterator pointing to the end of the scanned string part is returned.
|
||||
|
||||
\helpref{ParseRfc822Date}{wxdatetimeparserfc822date}\\
|
||||
\helpref{ParseFormat}{wxdatetimeparseformat}\\
|
||||
\helpref{ParseDateTime}{wxdatetimeparsedatetime}\\
|
||||
\helpref{ParseDate}{wxdatetimeparsedate}\\
|
||||
\helpref{ParseTime}{wxdatetimeparsetime}\\
|
||||
\helpref{ParseISODate}{wxdatetimeparseisodate}\\
|
||||
\helpref{ParseISOTime}{wxdatetimeparseisotime}\\
|
||||
\helpref{ParseISOCombined}{wxdatetimeparseisocombined}\\
|
||||
\helpref{ParseRfc822Date}{wxdatetimeparserfc822date}\\
|
||||
\helpref{Format}{wxdatetimeformat}\\
|
||||
\helpref{FormatDate}{wxdatetimeformatdate}\\
|
||||
\helpref{FormatTime}{wxdatetimeformattime}\\
|
||||
\helpref{FormatISOCombined}{wxdatetimeformatisocombined}\\
|
||||
\helpref{FormatISODate}{wxdatetimeformatisodate}\\
|
||||
\helpref{FormatISOTime}{wxdatetimeformatisotime}
|
||||
|
||||
@@ -1279,6 +1284,35 @@ Returns {\tt NULL} if the conversion failed, otherwise return the pointer to
|
||||
the character which stopped the scan.
|
||||
|
||||
|
||||
\membersection{wxDateTime::ParseISODate}\label{wxdatetimeparseisodate}
|
||||
|
||||
\func{bool}{ParseISODate}{\param{const wxString\& }{date}}
|
||||
|
||||
This function parses the date in ISO 8601 format (YYYY-MM-DD).
|
||||
|
||||
Returns \true if the entire string was parsed successfully, \false otherwise.
|
||||
|
||||
|
||||
\membersection{wxDateTime::ParseISOTime}\label{wxdatetimeparseisotime}
|
||||
|
||||
\func{bool}{ParseISOTime}{\param{const wxString\& }{date}}
|
||||
|
||||
This function parses the time in ISO 8601 format (HH:MM:SS).
|
||||
|
||||
Returns \true if the entire string was parsed successfully, \false otherwise.
|
||||
|
||||
|
||||
\membersection{wxDateTime::ParseISOCombined}\label{wxdatetimeparseisocombined}
|
||||
|
||||
\func{bool}{ParseISOCombined}{\param{const wxString\& }{date}, \param{char }{sep = 'T'}}
|
||||
|
||||
This function parses the string containing the date and time in ISO 8601
|
||||
combined format (YYYY-MM-DDTHH:MM:SS). The separator between the date and time
|
||||
parts must be equal to \arg{sep} for the function to succeed.
|
||||
|
||||
Returns \true if the entire string was parsed successfully, \false otherwise.
|
||||
|
||||
|
||||
\membersection{wxDateTime::Format}\label{wxdatetimeformat}
|
||||
|
||||
\constfunc{wxString }{Format}{\param{const wxChar *}{format = wxDefaultDateTimeFormat}, \param{const TimeZone\& }{tz = Local}}
|
||||
@@ -1311,6 +1345,23 @@ Identical to calling \helpref{Format()}{wxdatetimeformat} with {\tt "\%X"}
|
||||
argument (which means `preferred time representation for the current locale').
|
||||
|
||||
|
||||
\membersection{wxDateTime::FormatISOCombined}\label{wxdatetimeformatisocombined}
|
||||
|
||||
\constfunc{wxString}{FormatISOCombined}{\param{char }{sep = 'T'}}
|
||||
|
||||
Returns the combined date-time representation in the ISO 8601 format
|
||||
(YYYY-MM-DDTHH:MM:SS). The \arg{sep} parameter default value produces the
|
||||
result exactly corresponding to the ISO standard, but it can also be useful to
|
||||
use a space as seprator if a more human-readable combined date-time
|
||||
representation is needed.
|
||||
|
||||
\wxheading{See also}
|
||||
|
||||
\helpref{FormatISODate}{wxdatetimeformatisodate},\\
|
||||
\helpref{FormatISOTime}{wxdatetimeformatisotime},\\
|
||||
\helpref{ParseISOCombined}{wxdatetimeparseisocombined}
|
||||
|
||||
|
||||
\membersection{wxDateTime::FormatISODate}\label{wxdatetimeformatisodate}
|
||||
|
||||
\constfunc{wxString }{FormatISODate}{\void}
|
||||
|
@@ -1109,7 +1109,7 @@ public:
|
||||
}
|
||||
|
||||
const char *ParseFormat(const char *date,
|
||||
const wxString& format = L"%c",
|
||||
const wxString& format = "%c",
|
||||
const wxDateTime& dateDef = wxDefaultDateTime)
|
||||
{
|
||||
return ParseFormat(wxString(date), format, dateDef);
|
||||
@@ -1122,6 +1122,29 @@ public:
|
||||
return ParseFormat(wxString(date), wxString(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)
|
||||
{
|
||||
const wxStringCharType *p = ParseFormat(date, wxS("%Y-%m-%d"));
|
||||
return p && !*p;
|
||||
}
|
||||
|
||||
bool ParseISOTime(const wxString& date)
|
||||
{
|
||||
const wxStringCharType *p = ParseFormat(date, wxS("%H:%M:%S"));
|
||||
return p && !*p;
|
||||
}
|
||||
|
||||
bool ParseISOCombined(const wxString& date, char sep = 'T')
|
||||
{
|
||||
const wxString fmt = wxS("%Y-%m-%d") + wxString(sep) + wxS("%H:%M:%S");
|
||||
const wxStringCharType *p = ParseFormat(date, fmt.wx_str());
|
||||
return p && !*p;
|
||||
}
|
||||
|
||||
// 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,
|
||||
@@ -1191,15 +1214,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
|
||||
// ------------------------------------------------------------------------
|
||||
|
@@ -27,7 +27,7 @@
|
||||
// need this to be able to use CPPUNIT_ASSERT_EQUAL with wxDateTime objects
|
||||
static std::ostream& operator<<(std::ostream& ostr, const wxDateTime& dt)
|
||||
{
|
||||
ostr << dt.FormatISODate() << " " << dt.FormatISOTime();
|
||||
ostr << dt.FormatISOCombined(' ');
|
||||
|
||||
return ostr;
|
||||
}
|
||||
@@ -188,6 +188,7 @@ private:
|
||||
CPPUNIT_TEST( TestTimeTicks );
|
||||
CPPUNIT_TEST( TestParceRFC822 );
|
||||
CPPUNIT_TEST( TestDateParse );
|
||||
CPPUNIT_TEST( TestDateParseISO );
|
||||
CPPUNIT_TEST( TestDateTimeParse );
|
||||
CPPUNIT_TEST( TestTimeArithmetics );
|
||||
CPPUNIT_TEST( TestDSTBug );
|
||||
@@ -205,6 +206,7 @@ private:
|
||||
void TestTimeTicks();
|
||||
void TestParceRFC822();
|
||||
void TestDateParse();
|
||||
void TestDateParseISO();
|
||||
void TestDateTimeParse();
|
||||
void TestTimeArithmetics();
|
||||
void TestDSTBug();
|
||||
@@ -838,6 +840,80 @@ void DateTimeTestCase::TestDateParse()
|
||||
}
|
||||
}
|
||||
|
||||
void DateTimeTestCase::TestDateParseISO()
|
||||
{
|
||||
static const struct
|
||||
{
|
||||
const char *str;
|
||||
Date date; // NB: this should be in UTC
|
||||
bool good;
|
||||
} parseTestDates[] =
|
||||
{
|
||||
{ "2006-03-21", { 21, wxDateTime::Mar, 2006 }, true },
|
||||
{ "1976-02-29", { 29, wxDateTime::Feb, 1976 }, true },
|
||||
{ "0006-03-31", { 31, wxDateTime::Mar, 6 }, true },
|
||||
|
||||
// some invalid ones too
|
||||
{ "2006:03:31" },
|
||||
{ "31/04/06" },
|
||||
{ "bloordyblop" },
|
||||
{ "" },
|
||||
};
|
||||
|
||||
static const struct
|
||||
{
|
||||
const char *str;
|
||||
wxDateTime::wxDateTime_t hour, min, sec;
|
||||
bool good;
|
||||
} parseTestTimes[] =
|
||||
{
|
||||
{ "13:42:17", 13, 42, 17, true },
|
||||
{ "02:17:01", 2, 17, 1, true },
|
||||
|
||||
// some invalid ones too
|
||||
{ "66:03:31" },
|
||||
{ "31/04/06" },
|
||||
{ "bloordyblop" },
|
||||
{ "" },
|
||||
};
|
||||
|
||||
for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ )
|
||||
{
|
||||
wxDateTime dt;
|
||||
if ( dt.ParseISODate(parseTestDates[n].str) )
|
||||
{
|
||||
CPPUNIT_ASSERT( parseTestDates[n].good );
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL( parseTestDates[n].date.DT(), dt );
|
||||
|
||||
for ( size_t m = 0; m < WXSIZEOF(parseTestTimes); m++ )
|
||||
{
|
||||
wxString dtCombined;
|
||||
dtCombined << parseTestDates[n].str
|
||||
<< 'T'
|
||||
<< parseTestTimes[m].str;
|
||||
|
||||
if ( dt.ParseISOCombined(dtCombined) )
|
||||
{
|
||||
CPPUNIT_ASSERT( parseTestTimes[m].good );
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL( parseTestTimes[m].hour, dt.GetHour()) ;
|
||||
CPPUNIT_ASSERT_EQUAL( parseTestTimes[m].min, dt.GetMinute()) ;
|
||||
CPPUNIT_ASSERT_EQUAL( parseTestTimes[m].sec, dt.GetSecond()) ;
|
||||
}
|
||||
else // failed to parse combined date/time
|
||||
{
|
||||
CPPUNIT_ASSERT( !parseTestTimes[m].good );
|
||||
}
|
||||
}
|
||||
}
|
||||
else // failed to parse
|
||||
{
|
||||
CPPUNIT_ASSERT( !parseTestDates[n].good );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DateTimeTestCase::TestDateTimeParse()
|
||||
{
|
||||
static const struct ParseTestData
|
||||
|
Reference in New Issue
Block a user