On Thu, Apr 16, 2009 at 10:45, <s...@pobox.com> wrote: > >>> date(2008, 1, 30) + monthdelta(1) > datetime.date(2008, 2, 29) > > What would this loop would print? > > for d in range(1, 32): > print date(2008, 1, d) + monthdelta(1) > > I have this funny feeling that arithmetic using monthdelta wouldn't always > be intuitive.
FWIW, the Oracle database has two methods for adding months: 1- the add_months() function add_months(to_date('31-jan-2005'), 1) 2- the ANSI interval: to_date('31-jan-2005') + interval '1' month "add_months" is calendar sensitive, "interval" is not. "interval" raises an exception if the day is not valid for the target month (which is the case in my example) "add_months" is similar to the proposed monthdelta(), except that it has a special case for the last day of the month: """ If date is the last day of the month or if the resulting month has fewer days than the day component of date, then the result is the last day of the resulting month. Otherwise, the result has the same day component as date. """ indeed: add_months(to_date('28-feb-2005'), 1) == to_date('31-mar-2005') In my opinion: arithmetic with months is a mess. There is no such "month interval" or "year interval" with a precise definition. If we adopt some kind of month manipulation, it should be a function or a method, like you would do for features like last_day_of_month(d), or following_weekday(d, 'monday'). date(2008, 1, 30).add_months(1) == date(2008, 2, 29) -- Amaury Forgeot d'Arc _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com