9

Получить последний день месяца

6

Есть ли способ с использованием стандартной библиотеки Python легко определить (т.е. в одном вызове функции) последний день заданного месяца?

Если стандартная библиотека не поддерживает эту возможность, предоставляет ли пакет dateutil такую функциональность?

5 ответ(ов)

2

Если вы не хотите импортировать модуль 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-й день произвольного месяца и добавляя четыре дня, что гарантированно попадает в следующий месяц. Затем мы вычитаем номер дня следующего месяца, чтобы получить последний день текущего.

1

Редактировать: Посмотрите на ответ @Blair Conrad для более элегантного решения.


>>> import datetime
>>> datetime.date(2000, 2, 1) - datetime.timedelta(days=1)
datetime.date(2000, 1, 31)
0

Чтобы получить последнюю дату месяца с использованием 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 день назад. Таким образом, вы получите последний день нужного вам месяца.

0

Вы можете использовать модуль 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=...) для получения последнего дня месяца.

0

Этот код на Python предназначен для нахождения последнего дня месяца для заданной даты any_day. Давайте разберем его по частям:

  1. any_day.replace(day=1) - здесь мы создаем новую дату, установив первый день месяца для any_day. Это просто помогает нам определить начало текущего месяца.

  2. timedelta(days=32) - добавляя 32 дня к первому дню месяца, мы гарантируем, что выйдем за пределы текущего месяца. Это необходимо, так как в самом длинном месяце (31 день) достаточно добавления 32 дней, чтобы добраться до следующего месяца.

  3. (any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - после добавления 32 дней, мы также заменяем день на 1, чтобы получить первый день месяца, следующего за текущим.

  4. - 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 на нужную дату.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь