Получить последний день месяца
Есть ли способ с использованием стандартной библиотеки Python легко определить (т.е. в одном вызове функции) последний день заданного месяца?
Если стандартная библиотека не поддерживает эту возможность, предоставляет ли пакет dateutil такую функциональность?
5 ответ(ов)
Если вы не хотите импортировать модуль calendar
, можно использовать простую функцию из двух шагов, как показано ниже:
import datetime
def last_day_of_month(any_day):
# День 28 есть в каждом месяце. Четыре дня позже – это всегда следующий месяц
next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
# вычитание номера текущего дня возвращает нас назад на один месяц
return next_month - datetime.timedelta(days=next_month.day)
Вот пример использования этой функции:
>>> for month in range(1, 13):
... print(last_day_of_month(datetime.date(2022, month, 1)))
...
2022-01-31
2022-02-28
2022-03-31
2022-04-30
2022-05-31
2022-06-30
2022-07-31
2022-08-31
2022-09-30
2022-10-31
2022-11-30
2022-12-31
Эта функция работает, беря 28-й день произвольного месяца и добавляя четыре дня, что гарантированно попадает в следующий месяц. Затем мы вычитаем номер дня следующего месяца, чтобы получить последний день текущего.
Редактировать: Посмотрите на ответ @Blair Conrad для более элегантного решения.
>>> import datetime
>>> datetime.date(2000, 2, 1) - datetime.timedelta(days=1)
datetime.date(2000, 1, 31)
Чтобы получить последнюю дату месяца с использованием dateutil.relativedelta
, вы можете воспользоваться следующим примером:
from dateutil.relativedelta import relativedelta
from datetime import datetime
# Предположим, что mydate - это дата, для которой мы хотим найти последний день месяца
mydate = datetime(2023, 10, 15) # Пример даты
last_date_of_month = datetime(mydate.year, mydate.month, 1) + relativedelta(months=1, days=-1)
Идея заключается в том, чтобы сначала получить первый день месяца, а затем, используя relativedelta
, перейти на 1 месяц вперёд и на 1 день назад. Таким образом, вы получите последний день нужного вам месяца.
Вы можете использовать модуль datetime
вместе с модулем calendar
, чтобы получить первый и последний дни месяца для текущей даты. Вот пример кода, который демонстрирует это:
import datetime
import calendar
date = datetime.datetime.now()
print(date) # например, 2015-03-06 01:25:14.939574
# Получаем первый день текущего месяца
print(date.replace(day=1)) # 2015-03-01 01:25:14.939574
# Получаем последний день текущего месяца
last_day = calendar.monthrange(date.year, date.month)[1]
print(date.replace(day=last_day)) # 2015-03-31 01:25:14.939574
Здесь мы используем datetime.datetime.now()
для получения текущей даты и времени, а затем replace(day=1)
для получения первого дня месяца. Чтобы найти последний день месяца, мы используем calendar.monthrange
, который возвращает кортеж, содержащий количество дней в месяце. Мы извлекаем второй элемент этого кортежа и передаем его в replace(day=...)
для получения последнего дня месяца.
Этот код на Python предназначен для нахождения последнего дня месяца для заданной даты any_day
. Давайте разберем его по частям:
any_day.replace(day=1)
- здесь мы создаем новую дату, установив первый день месяца дляany_day
. Это просто помогает нам определить начало текущего месяца.timedelta(days=32)
- добавляя 32 дня к первому дню месяца, мы гарантируем, что выйдем за пределы текущего месяца. Это необходимо, так как в самом длинном месяце (31 день) достаточно добавления 32 дней, чтобы добраться до следующего месяца.(any_day.replace(day=1) + timedelta(days=32)).replace(day=1)
- после добавления 32 дней, мы также заменяем день на 1, чтобы получить первый день месяца, следующего за текущим.- timedelta(days=1)
- вычитая 1 день, мы получаем последний день текущего месяца, так как предыдущий день после первого числа следующего месяца будет последним днем текущего месяца.
В результате, все эти операции позволяют нам определить последний день месяца для любой заданной даты any_day
.
Пример использования:
from datetime import datetime, timedelta
any_day = datetime(2023, 10, 15) # Задаем произвольную дату
last_day_of_month = (any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
print(last_day_of_month) # Вывод: 2023-10-31 00:00:00
Таким образом, данный код эффективно находит последний день любого месяца, просто изменив any_day
на нужную дату.
Преобразование даты в datetime в Python
Как получить день недели по заданной дате?
Где найти документацию по форматированию даты в JavaScript?
Сохранить график в файл изображения вместо его отображения
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе