On Sun, Mar 15, 2009 at 11:00 AM, <tinn...@isbd.co.uk> wrote: > Roy Smith <r...@panix.com> wrote: >> In article <49bd3ab8$0$510$bed64...@news.gradwell.net>, tinn...@isbd.co.uk >> wrote: >> >> > I have a date in the form of a datetime object and I want to add (for >> > example) three months to it. At the moment I can't see any very >> > obvious way of doing this. I need something like:- >> > >> > myDate = datetime.date.today() >> > inc = datetime.timedelta(months=3) >> > myDate += inc >> > >> > but, of course, timedelta doesn't know about months. I had a look at >> > the calendar object but that didn't seem to help much. >> >> Well, before you can "add three months" to something, you need to explain >> what that means. >> >> What is Nov 29th plus 3 months? >> >> What is Jan 31st plus 3 months? >> >> Months are different lengths. Asking to "add 3 months" is kind of like >> asking, "If I'm somewhere in the continental US (east of the Mississippi >> River) and move three states to the west, how many miles have I moved?" > > No, it's perfectly possible applying simple logic. My reminder > program manages it perfectly well. I have, for example, two sets of > three monthly reminders. > > One starts on Jan 19th and repeats three monthly, that means Jan > 19th, April 19th, July 19th and October 19th. Very simple. > > The other is a little more difficult, it starts on December 31st > and repeats three monthly. So that one is on December 31st, March > 31st, June 30th and September 30th. > > The calendar program manages it perfectly well using what seems to me > fairly obvious logic, what I want is to be able to do the same in > Python. > > I.e. in simple terms I want the "same day N months hence" and, if it > doesn't exist then the nearest possible.
But that's not what you said originally; you now fleshed out important details. Your original question was simpler and more ambiguous. The problem here is that there are multiple ways to handle the ambiguous situations and there's no objective, obvious right choice. Thus, though one must implement it by oneself, one gets exactly the behavior one desires. Besides your behavior, one could equally well argue that a 31st repeat on months without a 31st should just be dropped, or that it should carry over onto the 1st of the next month (ignoring the complications of February). Which behavior one needs is completely context-dependent. Cheers, Chris -- I have a blog: http://blog.rebertia.com -- http://mail.python.org/mailman/listinfo/python-list