# of Months between two dates
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Fri Apr 6 02:16:37 EDT 2018
On Thu, 05 Apr 2018 22:03:07 -0600, Jason Friedman wrote:
>> > > I've written a function to return the months between date1 and
>> > > date2
>> but
>> > > I'd like to know if anyone is aware of anything in the standard
>> > > library to do the same? For bonus points, does anyone know if
>> > > postgres can do the same (we use a lot of date/time funcitons in
>> > > postgres, already, but didn't see this problem addressed).
>>
>>
>
>> > It's probably better to write the function yourself according to what
>> > makes sense in your use-case, and document its behaviour clearly.
>>
>>
> I suggest using the dateutil module (
> https://pypi.python.org/pypi/python-dateutil) before writing your own.
I'm not seeing a "months between" function in dateutil. Have I missed
something?
The question of how many months are between two dates is hard to answer.
For example:
- between Jan 1 and Feb 1 is clearly one month (31 days);
- unless you think all months should be 30 days, in which case
its one month and one day;
- giving one month from Jan 1 as Jan 31, which seems weird;
- either way, the period between Feb 1 and Mar 1 is only four
weeks and so obviously less than one month;
- unless you think a month is four weeks precisely;
- in which case it is one month between Jan 1 and Jan 29;
- one month forward from Jun 30 is clearly Jul 30;
- but one month back from Jul 31 is either Jun 30 or Jul 1;
- instead of counting days, with all the difficulty that
causes, we could just count how many times the month
changes;
- in which case, Jan 31 to Feb 1 is one month.
I wish the calendar designers had made the year 13 months of exactly 4
weeks each, with one intercalary day left over (two in leap years). Half
a year becomes exactly 6 months and two weeks; a quarter of a year
becomes three months and one week. A third is a bit more than four weeks.
Date calculations would be much simpler, with only one (or two in leap
years) special case, the intercalary day, instead of 36.
--
Steve
More information about the Python-list
mailing list