я знаю, используя datetime.timedelta я могу получить дату нескольких дней от данной даты
daysafter = datetime.date.today() + datetime.timedelta(days=5)
но, похоже, нет datetime.timedelta(month=1)
я знаю, используя datetime.timedelta я могу получить дату нескольких дней от данной даты
daysafter = datetime.date.today() + datetime.timedelta(days=5)
но, похоже, нет datetime.timedelta(month=1)
Конечно, нет - если сегодня 31 января, что будет "в тот же день следующего месяца"?! Очевидно, что правильного решения нет, так как 31 февраля не существует, а модуль datetime
выполняет не воспроизведение "угадать, что пользователь, создающий эту невозможную проблему без правильного решения, считает (ошибочно) очевидное решение"; -).
Я предлагаю:
try:
nextmonthdate = x.replace(month=x.month+1)
except ValueError:
if x.month == 12:
nextmonthdate = x.replace(year=x.year+1, month=1)
else:
# next month is too short to have "same date"
# pick your own heuristic, or re-raise the exception:
raise
Используйте dateutil
. Он имеет относительные временные дельта:
import datetime
from dateutil import relativedelta
nextmonth = datetime.date.today() + relativedelta.relativedelta(months=1)
Красивая.
import calendar, datetime
def next_month ( date ):
"""return a date one month in advance of 'date'.
If the next month has fewer days then the current date month, this will return an
early date in the following month."""
return date + datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1])
from calendar import mdays
from datetime import datetime, timedelta
today = datetime.now()
next_month_of_today = today + timedelta(mdays[today.month])
Я не хочу импортировать dateutil. Попробуйте это. Удачи.
Эта работа для меня
import datetime
import calendar
def next_month_date(d):
_year = d.year+(d.month//12)
_month = 1 if (d.month//12) else d.month + 1
next_month_len = calendar.monthrange(_year,_month)[1]
next_month = d
if d.day > next_month_len:
next_month = next_month.replace(day=next_month_len)
next_month = next_month.replace(year=_year, month=_month)
return next_month
использование:
d = datetime.datetime.today()
print next_month_date(d)
from datetime import timedelta
try:
next_month = (x.replace(day=28) + timedelta(days=7)).replace(day=x.day)
except ValueError: # assuming January 31 should return last day of February.
next_month = (x + timedelta(days=31)).replace(day=1) - timedelta(days=1)
Вот как я это решил.
from datetime import date
try:
(year, month) = divmod(date.today().month, 12)
next_month = date.today().replace(year=date.today().year+year, month=month+1)
except ValueError:
# This day does not exist in next month
Вы можете пропустить try/catch, если хотите только первый день в следующем месяце, установив replace(year=date.today().year+year, month=month, day=1)
. Это всегда будет допустимой датой, так как мы поймали переполнение месяца с помощью divmod
.
Посмотрев, какой месяц равен 32 дням, вы можете выяснить, является ли это последний день месяца и существует ли дата в следующем месяце. Это потому, что хотя бы один из двух месяцев подряд содержит 31 день
from datetime import date, timedelta
def in_a_month(d):
in_32_days = d + timedelta(32)
if (in_32_days.month - d.month) % 12 > 1:
return in_32_days - timedelta(in_32_days.day)
else:
return date(in_32_days.year, in_32_days.month, d.day)
Или если вам нужно решение, чтобы добавить или удалить произвольное количество месяцев
from datetime import date, timedelta
def last_day_in_month(a_date, months_forward = 0):
month_index = a_date.year * 12 + a_date.month + months_forward
y = month_index // 12
m = (month_index % 12) + 1
return date(y, m, 1) - timedelta(1)
def add_month(a_date, months = 1):
is_last_day = a_date == last_day_in_month(a_date)
last_in_target_month = last_day_in_month(a_date, months)
if is_last_day or a_date.day > last_in_target_month.day:
return last_in_target_month
else:
return last_in_target_month.replace(day = a_date.day)
Вы можете использовать calendar.nextmonth
(из Python 3.7).
>>> import calendar
>>> calendar.nextmonth(year=2019, month=6)
(2019, 7)
>>> calendar.nextmonth(year=2019, month=12)
(2020, 1)