From 936284fe41695b903f6679e9727bbf3a1c8b2f3b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 24 Oct 2002 16:11:02 +0000 Subject: [PATCH] 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 --- docs/latex/wx/datetime.tex | 10 +++++----- include/wx/datetime.h | 14 ++++++++++---- include/wx/datetime.inl | 8 +++++--- src/common/datetime.cpp | 32 +++++++++++++++++++++++++++----- 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/docs/latex/wx/datetime.tex b/docs/latex/wx/datetime.tex index 3baa8dab1c..98b74460fe 100644 --- a/docs/latex/wx/datetime.tex +++ b/docs/latex/wx/datetime.tex @@ -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,9 +1136,9 @@ 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 +Returns the copy of this object to which \helpref{SetToWeekDayInSameWeek}{wxdatetimesettoweekdayinsameweek} was applied. @@ -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. diff --git a/include/wx/datetime.h b/include/wx/datetime.h index 9f44e84143..72a48aeb53 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -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 diff --git a/include/wx/datetime.inl b/include/wx/datetime.inl index 8ec379dd9d..398b02828b 100644 --- a/include/wx/datetime.inl +++ b/include/wx/datetime.inl @@ -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 diff --git a/src/common/datetime.cpp b/src/common/datetime.cpp index 1f3ba66047..e5f6768a06 100644 --- a/src/common/datetime.cpp +++ b/src/common/datetime.cpp @@ -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)); }