]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxDateTime::FormatISOCombined() and ParseISODate/Time/Combined()
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 3 Feb 2008 13:04:56 +0000 (13:04 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 3 Feb 2008 13:04:56 +0000 (13:04 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51516 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/datetime.tex
include/wx/datetime.h
tests/datetime/datetimetest.cpp

index 0e5431fe263a63e1c6a3c5173be5d82595fdb9df..79bca359247c02f5a47da4db834875f24542bddf 100644 (file)
@@ -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).
 - 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().
 - Added wxMutex::LockTimeout() (Aleksandr Napylov).
 - Added wxMemoryInputStream(wxInputStream&) ctor (Stas Sergeev).
 - Implemented wxMemoryInputStream::CanRead().
index dd67d84bd7c8e00fd07b1bed1448cb51096dcd54..3fa45268da0fa695079f7874f5e6c122afbb6669 100644 (file)
@@ -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{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
 
 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.
 
 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{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{Format}{wxdatetimeformat}\\
 \helpref{FormatDate}{wxdatetimeformatdate}\\
 \helpref{FormatTime}{wxdatetimeformattime}\\
+\helpref{FormatISOCombined}{wxdatetimeformatisocombined}\\
 \helpref{FormatISODate}{wxdatetimeformatisodate}\\
 \helpref{FormatISOTime}{wxdatetimeformatisotime}
 
 \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.
 
 
 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}}
 \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').
 
 
 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}
 \membersection{wxDateTime::FormatISODate}\label{wxdatetimeformatisodate}
 
 \constfunc{wxString }{FormatISODate}{\void}
index 5aac2b16d40046d8ee11a11bf2f9ffe7ba78ce70..c648073ed8f888d3f7a4005ac805c944c5c86b07 100644 (file)
@@ -1109,7 +1109,7 @@ public:
     }
 
     const char *ParseFormat(const char *date,
     }
 
     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);
                             const wxDateTime& dateDef = wxDefaultDateTime)
     {
         return ParseFormat(wxString(date), format, dateDef);
@@ -1122,6 +1122,29 @@ public:
         return ParseFormat(wxString(date), wxString(format), dateDef);
     }
 
         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,
         // 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 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
         // 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)
         // 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)
         // 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
     // ------------------------------------------------------------------------
 
     // implementation
     // ------------------------------------------------------------------------
index 9954829477b3cb11ec5089dd848d85828d775262..3a2db4a287b777277b9f0bf30a0ce3989708d5a6 100644 (file)
@@ -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)
 {
 // 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;
 }
 
     return ostr;
 }
@@ -188,6 +188,7 @@ private:
         CPPUNIT_TEST( TestTimeTicks );
         CPPUNIT_TEST( TestParceRFC822 );
         CPPUNIT_TEST( TestDateParse );
         CPPUNIT_TEST( TestTimeTicks );
         CPPUNIT_TEST( TestParceRFC822 );
         CPPUNIT_TEST( TestDateParse );
+        CPPUNIT_TEST( TestDateParseISO );
         CPPUNIT_TEST( TestDateTimeParse );
         CPPUNIT_TEST( TestTimeArithmetics );
         CPPUNIT_TEST( TestDSTBug );
         CPPUNIT_TEST( TestDateTimeParse );
         CPPUNIT_TEST( TestTimeArithmetics );
         CPPUNIT_TEST( TestDSTBug );
@@ -205,6 +206,7 @@ private:
     void TestTimeTicks();
     void TestParceRFC822();
     void TestDateParse();
     void TestTimeTicks();
     void TestParceRFC822();
     void TestDateParse();
+    void TestDateParseISO();
     void TestDateTimeParse();
     void TestTimeArithmetics();
     void TestDSTBug();
     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
 void DateTimeTestCase::TestDateTimeParse()
 {
     static const struct ParseTestData