several bug fixes in ParseDate()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7455 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -3016,9 +3016,12 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
int year = 0;
|
int year = 0;
|
||||||
|
|
||||||
// tokenize the string
|
// tokenize the string
|
||||||
wxStringTokenizer tok(p, _T(",/-\t\n "));
|
size_t nPosCur = 0;
|
||||||
|
static const wxChar *dateDelimiters = _T(".,/-\t\n ");
|
||||||
|
wxStringTokenizer tok(p, dateDelimiters);
|
||||||
while ( tok.HasMoreTokens() )
|
while ( tok.HasMoreTokens() )
|
||||||
{
|
{
|
||||||
|
nPosCur = tok.GetPosition();
|
||||||
wxString token = tok.GetNextToken();
|
wxString token = tok.GetNextToken();
|
||||||
|
|
||||||
// is it a number?
|
// is it a number?
|
||||||
@@ -3098,7 +3101,8 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
|
|
||||||
haveMon = TRUE;
|
haveMon = TRUE;
|
||||||
|
|
||||||
mon = (wxDateTime::Month)val;
|
// month 1 is Jan
|
||||||
|
mon = (wxDateTime::Month)(val - 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3116,7 +3120,7 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
if ( (day <= 12) && !haveMon )
|
if ( (day <= 12) && !haveMon )
|
||||||
{
|
{
|
||||||
// exchange day and month
|
// exchange day and month
|
||||||
mon = (wxDateTime::Month)day;
|
mon = (wxDateTime::Month)(day - 1);
|
||||||
|
|
||||||
haveMon = TRUE;
|
haveMon = TRUE;
|
||||||
}
|
}
|
||||||
@@ -3225,13 +3229,13 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
// parse - in any case, see if we can construct a date from what we have
|
// parse - in any case, see if we can construct a date from what we have
|
||||||
if ( !haveDay && !haveWDay )
|
if ( !haveDay && !haveWDay )
|
||||||
{
|
{
|
||||||
wxLogDebug(_T("no day, no weekday hence no date."));
|
wxLogDebug(_T("ParseDate: no day, no weekday hence no date."));
|
||||||
|
|
||||||
return (wxChar *)NULL;
|
return (wxChar *)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( haveWDay && (haveMon || haveYear || haveDay) &&
|
if ( haveWDay && (haveMon || haveYear || haveDay) &&
|
||||||
!(haveMon && haveMon && haveYear) )
|
!(haveDay && haveMon && haveYear) )
|
||||||
{
|
{
|
||||||
// without adjectives (which we don't support here) the week day only
|
// without adjectives (which we don't support here) the week day only
|
||||||
// makes sense completely separately or with the full date
|
// makes sense completely separately or with the full date
|
||||||
@@ -3239,6 +3243,37 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
return (wxChar *)NULL;
|
return (wxChar *)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( !haveWDay && haveYear && !(haveDay && haveMon) )
|
||||||
|
{
|
||||||
|
// may be we have month and day instead of day and year?
|
||||||
|
if ( haveDay && !haveMon )
|
||||||
|
{
|
||||||
|
if ( day <= 12 )
|
||||||
|
{
|
||||||
|
// exchange day and month
|
||||||
|
mon = (wxDateTime::Month)(day - 1);
|
||||||
|
|
||||||
|
// we're in the current year then
|
||||||
|
if ( year <= GetNumOfDaysInMonth(Inv_Year, mon) )
|
||||||
|
{
|
||||||
|
day = year;
|
||||||
|
|
||||||
|
haveMon = TRUE;
|
||||||
|
haveYear = FALSE;
|
||||||
|
}
|
||||||
|
//else: no, can't exchange, leave haveMon == FALSE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !haveMon )
|
||||||
|
{
|
||||||
|
// if we give the year, month and day must be given too
|
||||||
|
wxLogDebug(_T("ParseDate: day and month should be specified if year is."));
|
||||||
|
|
||||||
|
return (wxChar *)NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( !haveMon )
|
if ( !haveMon )
|
||||||
{
|
{
|
||||||
mon = GetCurrentMonth();
|
mon = GetCurrentMonth();
|
||||||
@@ -3259,6 +3294,8 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
if ( GetWeekDay() != wday )
|
if ( GetWeekDay() != wday )
|
||||||
{
|
{
|
||||||
// inconsistency detected
|
// inconsistency detected
|
||||||
|
wxLogDebug(_T("ParseDate: inconsistent day/weekday."));
|
||||||
|
|
||||||
return (wxChar *)NULL;
|
return (wxChar *)NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3270,8 +3307,16 @@ const wxChar *wxDateTime::ParseDate(const wxChar *date)
|
|||||||
SetToWeekDayInSameWeek(wday);
|
SetToWeekDayInSameWeek(wday);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the pointer to the next char
|
// return the pointer to the first unparsed char
|
||||||
return p + wxStrlen(p) - wxStrlen(tok.GetString());
|
p += nPosCur;
|
||||||
|
if ( nPosCur && wxStrchr(dateDelimiters, *(p - 1)) )
|
||||||
|
{
|
||||||
|
// if we couldn't parse the token after the delimiter, put back the
|
||||||
|
// delimiter as well
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
const wxChar *wxDateTime::ParseTime(const wxChar *time)
|
const wxChar *wxDateTime::ParseTime(const wxChar *time)
|
||||||
|
Reference in New Issue
Block a user