# # 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
>>
>>
>
>> > 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

```