如果 end_date 落在一个月的最后一天,如何在不跨越月份边界的情况下从 end_date 中减去完整月份?

How to subtract full months from end_date without crossing the month boundary if end_date falls on the last day of a month?

我的目标是在结束日期落在一个月的最后一天时,从给定的结束日期减去 2 个完整的月份而不跨越最后一个月的边界。

例如,如果 end_date 是 2011-02-28,我从中减去 2 个整月,则开始日期应该是 2011-01-01,因为 2011 年 2 月已经全部发生。需要的额外一个月是 2011 年 1 月。我尝试使用 dateutil.relativedelta 完成此操作,如下所示:

from dateutil.relativedelta import relativedelta
from dateutil import parser


end_date_1 = parser.parse("2011-02-28").date()
end_date_2 = parser.parse("2011-02-15").date()

time_period = relativedelta(months=2)

start_date_1 = end_date_1 - time_period
start_date_2 = end_date_2 - time_period

print(start_date_1)
print(start_date_2)

这给出了以下输出:

2010-12-28 # should be 2011-01-01
2010-12-15 # correct!

这里默认每个月的天数是30天。因此,您得到的日期是 end_date 之前 60 天,如 start_date。 您可以对两个日期使用单独的 time_period,并传递天数而不是月份以获得所需的结果。

time_period_1 = relativedelta(days = 58)
time_period = relativedelta(months = 2)


start_date_1 = end_date_1 - time_period_1
start_date_2 = end_date_2 - time_period

一种方法是检查日期是否是该月的最后一天

from dateutil.relativedelta import relativedelta
from dateutil import parser


def start_date(end_date, mdelta):
    next_day = end_date + relativedelta(days=1)  # get the next day to determine if d is the last date of month
    return (next_day if next_day.day == 1 else end_date) + relativedelta(months=mdelta)  # so add relativedelta to d or d1 according to the condition


for d in ['2011-02-28', '2011-02-15', '2011-04-30', '2011-01-30']:
    print(start_date(parser.parse(d).date(), -2))

输出:

2011-01-01
2010-12-15
2011-03-01
2010-11-30