Subject: [Boost-bugs] [Boost C++ Libraries] #5753: previous_weekday() returns the very same day
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2011-08-04 22:05:33
#5753: previous_weekday() returns the very same day
-------------------------------+--------------------------------------------
Reporter: mjklaim@⦠| Owner: az_sw_dude
Type: Bugs | Status: new
Milestone: To Be Determined | Component: date_time
Version: Boost 1.44.0 | Severity: Problem
Keywords: |
-------------------------------+--------------------------------------------
We have a bug that seems to comes from
boost::date_time::previous_weekday()
(probably next_weekday() too) usage in case we want to go from a weekday
to
another same weekday:
{{{
#include <iostream>
#include <boost/date_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
int main()
{
using namespace boost::gregorian;
auto today = date( 2011, Jul, 12 );
auto last_tuesday = boost::date_time::previous_weekday( today,
greg_weekday(boost::date_time::Tuesday) );
std::cout << today << '\n';
std::cout << last_tuesday;
std::cin.ignore();
return 0;
}
}}}
This example runs but return the same date twice instead of giving the
tuesday before the given date (that is already a tuesday).
Compiled with VS2010SP1 (boost 1.46.1) and GCC4.4(boost 1.44.0 - didn't
see
the difference in the code)
What we first supposed was it will go to the tuesday of the previous week
if
we already are tuesday.
It appears to not work this way.
Is it the wanted behaviour?
If it is, I suggest the documentation to be enhanced to warn the user
about
the case when you provide a date that is the same provided weekday.
The code of boost::date_time::previous_weekday() (as far as I understand
it) suggests that it should go to the previous week's weekday instead of
returning the same day:
{{{
template<class date_type, class weekday_type>
inline
date_type previous_weekday(const date_type& d, const weekday_type& wd)
{
return d - days_before_weekday(d, wd);
}
}}}
and then :
{{{
template<typename date_type, class weekday_type>
inline
typename date_type::duration_type days_before_weekday(const
date_type& d, const weekday_type& wd)
{
typedef typename date_type::duration_type duration_type;
duration_type wks(0);
duration_type dd(wd.as_number() - d.day_of_week().as_number()); // 1
if(dd.days() > 0){ // 2
wks = duration_type(7);
}
// we want a number of days, not an offset. The value returned must
// be zero or larger.
return (-dd + wks); // 3
}
}}}
Correct me if I'm wrong : 2. checks if the generated day is the same
weekday
than the provided one, right?
So if I'm correct, there might be a problem in 1 or 3?
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/5753> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:07 UTC