我需要增加一个datetime值的月份
next_month = datetime.datetime(mydate.year, mydate.month+1, 1)
当月份为12时,它变成13,并引发错误“month必须在1..12”。(我预计时间会增加)
我想使用timedelta,但它不带month参数。
有一个relativedelta python包,但我不想只为此安装它。
还有一个使用strtotime的解决方案。
time = strtotime(str(mydate));
next_month = date("Y-m-d", strtotime("+1 month", time));
我不想从datetime转换为str再转换为time,再转换为datetime;因此,它仍然是一个图书馆
有人有像使用timedelta一样好的简单的解决方案吗?
这个实现可能对处理账单的人有一定的价值。
如果您正在处理账单,您可能希望得到“下个月相同的日期(如果可能的话)”,而不是“增加一年的1/12”。
让人困惑的是如果你连续做这个,你实际上需要考虑两个值。否则,对于任何超过27日的日期,你将继续失去几天,直到闰年后的27日。
你需要考虑的价值:
您想要添加一个月的值
你开始的那一天
这样当你加一个月的时候,如果你从31号降到了30号,那么下个月有这一天的时候,你就会回到31号。
我是这样做的:
def closest_date_next_month(year, month, day):
month = month + 1
if month == 13:
month = 1
year = year + 1
condition = True
while condition:
try:
return datetime.datetime(year, month, day)
except ValueError:
day = day-1
condition = day > 26
raise Exception('Problem getting date next month')
paid_until = closest_date_next_month(
last_paid_until.year,
last_paid_until.month,
original_purchase_date.day) # The trick is here, I'm using the original date, that I started adding from, not the last one
使用time对象的示例:
start_time = time.gmtime(time.time()) # start now
#increment one month
start_time = time.gmtime(time.mktime([start_time.tm_year, start_time.tm_mon+1, start_time.tm_mday, start_time.tm_hour, start_time.tm_min, start_time.tm_sec, 0, 0, 0]))