fixed several bugs in wxDateTime week number calculations which required passing WeekFlags argument to more functions

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17621 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-10-24 16:11:02 +00:00
parent 47cfa2bd4c
commit 936284fe41
4 changed files with 47 additions and 17 deletions

View File

@@ -1127,7 +1127,7 @@ This function returns the time representation in the ISO 8601 format
\membersection{wxDateTime::SetToWeekDayInSameWeek}\label{wxdatetimesettoweekdayinsameweek}
\func{wxDateTime\&}{SetToWeekDayInSameWeek}{\param{WeekDay }{weekday}}
\func{wxDateTime\&}{SetToWeekDayInSameWeek}{\param{WeekDay }{weekday}, \param{WeekFlags}{flags = {\tt Monday\_First}}}
Adjusts the date so that it will still lie in the same week as before, but its
week day will be the given one.
@@ -1136,7 +1136,7 @@ Returns the reference to the modified object itself.
\membersection{wxDateTime::GetWeekDayInSameWeek}\label{wxdatetimegetweekdayinsameweek}
\constfunc{wxDateTime}{GetWeekDayInSameWeek}{\param{WeekDay }{weekday}}
\constfunc{wxDateTime}{GetWeekDayInSameWeek}{\param{WeekDay }{weekday}, \param{WeekFlags}{flags = {\tt Monday\_First}}}
Returns the copy of this object to which
\helpref{SetToWeekDayInSameWeek}{wxdatetimesettoweekdayinsameweek} was
@@ -1216,7 +1216,7 @@ Returns the copy of this object to which
\membersection{wxDateTime::SetToTheWeek}\label{wxdatetimesettotheweek}
\func{bool}{SetToTheWeek}{\param{wxDateTime\_t }{numWeek}, \param{WeekDay }{weekday = Mon}}
\func{bool}{SetToTheWeek}{\param{wxDateTime\_t }{numWeek}, \param{WeekDay }{weekday = Mon}, \param{WeekFlags}{flags = {\tt Monday\_First}}}
Set the date to the given {\it weekday} in the week with given number
{\it numWeek}. The number should be in range $1\ldots53$ and {\tt FALSE} will
@@ -1225,7 +1225,7 @@ date was changed successfully.
\membersection{wxDateTime::GetWeek}\label{wxdatetimegetweek}
\constfunc{wxDateTime}{GetWeek}{\param{wxDateTime\_t }{numWeek}, \param{WeekDay }{weekday = Mon}}
\constfunc{wxDateTime}{GetWeek}{\param{wxDateTime\_t }{numWeek}, \param{WeekDay }{weekday = Mon}, \param{WeekFlags}{flags = {\tt Monday\_First}}}
Returns the copy of this object to which
\helpref{SetToTheWeek}{wxdatetimesettotheweek} was applied.

View File

@@ -659,8 +659,10 @@ public:
// ------------------------------------------------------------------------
// set to the given week day in the same week as this one
wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday);
inline wxDateTime GetWeekDayInSameWeek(WeekDay weekday) const;
wxDateTime& SetToWeekDayInSameWeek(WeekDay weekday,
WeekFlags flags = Monday_First);
inline wxDateTime GetWeekDayInSameWeek(WeekDay weekday,
WeekFlags flags = Monday_First) const;
// set to the next week day following this one
wxDateTime& SetToNextWeekDay(WeekDay weekday);
@@ -694,8 +696,12 @@ public:
// sets the date to the given day of the given week in the year,
// returns TRUE on success and FALSE if given date doesn't exist (e.g.
// numWeek is > 53)
bool SetToTheWeek(wxDateTime_t numWeek, WeekDay weekday = Mon);
inline wxDateTime GetWeek(wxDateTime_t numWeek, WeekDay weekday = Mon) const;
bool SetToTheWeek(wxDateTime_t numWeek,
WeekDay weekday = Mon,
WeekFlags flags = Monday_First);
inline wxDateTime GetWeek(wxDateTime_t numWeek,
WeekDay weekday = Mon,
WeekFlags flags = Monday_First) const;
// sets the date to the last day of the given (or current) month or the
// given (or current) year

View File

@@ -156,7 +156,8 @@ inline bool wxDateTime::SetToLastWeekDay(WeekDay weekday,
return SetToWeekDay(weekday, -1, month, year);
}
inline wxDateTime wxDateTime::GetWeekDayInSameWeek(WeekDay weekday) const
inline wxDateTime wxDateTime::GetWeekDayInSameWeek(WeekDay weekday,
WeekFlags flags) const
{
MODIFY_AND_RETURN( SetToWeekDayInSameWeek(weekday) );
}
@@ -191,11 +192,12 @@ inline wxDateTime wxDateTime::GetLastWeekDay(WeekDay weekday,
}
inline wxDateTime wxDateTime::GetWeek(wxDateTime_t numWeek,
WeekDay weekday) const
WeekDay weekday,
WeekFlags flags) const
{
wxDateTime dt(*this);
return dt.SetToTheWeek(numWeek, weekday) ? dt : wxInvalidDateTime;
return dt.SetToTheWeek(numWeek, weekday, flags) ? dt : wxInvalidDateTime;
}
inline wxDateTime wxDateTime::GetLastMonthDay(Month month, int year) const

View File

@@ -1494,13 +1494,18 @@ wxDateTime& wxDateTime::Add(const wxDateSpan& diff)
// Weekday and monthday stuff
// ----------------------------------------------------------------------------
bool wxDateTime::SetToTheWeek(wxDateTime_t numWeek, WeekDay weekday)
bool wxDateTime::SetToTheWeek(wxDateTime_t numWeek,
WeekDay weekday,
WeekFlags flags)
{
wxASSERT_MSG( numWeek > 0,
_T("invalid week number: weeks are counted from 1") );
int year = GetYear();
// Jan 4 always lies in the 1st week of the year
Set(4, Jan, year);
SetToWeekDayInSameWeek(weekday) += wxDateSpan::Weeks(numWeek);
SetToWeekDayInSameWeek(weekday, flags) += wxDateSpan::Weeks(numWeek - 1);
if ( GetYear() != year )
{
@@ -1523,17 +1528,34 @@ wxDateTime& wxDateTime::SetToLastMonthDay(Month month,
return Set(GetNumOfDaysInMonth(year, month), month, year);
}
wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday)
wxDateTime& wxDateTime::SetToWeekDayInSameWeek(WeekDay weekday, WeekFlags flags)
{
wxDATETIME_CHECK( weekday != Inv_WeekDay, _T("invalid weekday") );
WeekDay wdayThis = GetWeekDay();
int wdayThis = GetWeekDay();
if ( weekday == wdayThis )
{
// nothing to do
return *this;
}
else if ( weekday < wdayThis )
if ( flags == Default_First )
{
flags = GetCountry() == USA ? Sunday_First : Monday_First;
}
// the logic below based on comparing weekday and wdayThis works if Sun (0)
// is the first day in the week, but breaks down for Monday_First case so
// we adjust the week days in this case
if( flags == Monday_First )
{
if ( wdayThis == Sun )
wdayThis += 7;
}
//else: Sunday_First, nothing to do
// go forward or back in time to the day we want
if ( weekday < wdayThis )
{
return Subtract(wxDateSpan::Days(wdayThis - weekday));
}