Получить последний день месяца в Python - PullRequest
514 голосов
/ 04 сентября 2008

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

Если стандартная библиотека не поддерживает это, поддерживает ли пакет dateutil это?

Ответы [ 28 ]

1 голос
/ 25 августа 2016

Я предпочитаю этот способ

import datetime
import calendar

date=datetime.datetime.now()
month_end_date=datetime.datetime(date.year,date.month,1) + datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1] - 1)
1 голос
/ 30 апреля 2014

Если вы хотите создать свою маленькую функцию, это хорошая отправная точка:

def eomday(year, month):
    """returns the number of days in a given month"""
    days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    d = days_per_month[month - 1]
    if month == 2 and (year % 4 == 0 and year % 100 != 0 or year % 400 == 0):
        d = 29
    return d

Для этого вы должны знать правила для високосных лет:

  • каждый четвертый год
  • за исключением каждых 100 лет
  • но каждые 400 лет
0 голосов
/ 14 ноября 2018

В приведенном ниже коде 'get_last_day_of_month (dt)' даст вам это с датой в строковом формате, например 'YYYY-MM-DD'.

import datetime

def DateTime( d ):
    return datetime.datetime.strptime( d, '%Y-%m-%d').date()

def RelativeDate( start, num_days ):
    d = DateTime( start )
    return str( d + datetime.timedelta( days = num_days ) )

def get_first_day_of_month( dt ):
    return dt[:-2] + '01'

def get_last_day_of_month( dt ):
    fd = get_first_day_of_month( dt )
    fd_next_month = get_first_day_of_month( RelativeDate( fd, 31 ) )
    return RelativeDate( fd_next_month, -1 )
0 голосов
/ 08 апреля 2018

Вот решение на основе python lambdas:

next_month = lambda y, m, d: (y, m + 1, 1) if m + 1 < 13 else ( y+1 , 1, 1)
month_end  = lambda dte: date( *next_month( *dte.timetuple()[:3] ) ) - timedelta(days=1)

Лямбда next_month находит кортеж первого дня следующего месяца и переносится на следующий год. month_end лямбда-преобразование даты (dte) в кортеж, применение next_month и создание новой даты. Тогда «конец месяца» - это просто первый день следующего месяца минус timedelta(days=1).

0 голосов
/ 12 марта 2018

Если вы передадите диапазон дат, вы можете использовать это:

def last_day_of_month(any_days):
    res = []
    for any_day in any_days:
        nday = any_day.days_in_month -any_day.day
        res.append(any_day + timedelta(days=nday))
    return res
0 голосов
/ 27 сентября 2017

Надеюсь, это очень полезно. Попробуйте на этом пути ... нам нужно импортировать пакет

import time
from datetime import datetime, date
from datetime import timedelta
from dateutil import relativedelta

  start_date = fields.Date(
        string='Start Date', 
        required=True,
        ) 

    end_date = fields.Date(
        string='End Date', 
        required=True,
        )

    _defaults = {
        'start_date': lambda *a: time.strftime('%Y-%m-01'),
        'end_date': lambda *a: str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1))[:10],
    }
0 голосов
/ 22 августа 2012

У меня есть простое решение:

import datetime   
datetime.date(2012,2, 1).replace(day=1,month=datetime.date(2012,2,1).month+1)-timedelta(days=1)
datetime.date(2012, 2, 29)
0 голосов
/ 16 мая 2016
import calendar
from time import gmtime, strftime
calendar.monthrange(int(strftime("%Y", gmtime())), int(strftime("%m", gmtime())))[1]

Выход:

31



Будет напечатан последний день текущего месяца. В этом примере это было 15 мая 2016 года. Таким образом, ваш вывод может быть другим, однако выходной будет столько же дней, сколько текущий месяц. Отлично, если вы хотите проверить последний день месяца, запустив ежедневную работу cron.

Итак:

import calendar
from time import gmtime, strftime
lastDay = calendar.monthrange(int(strftime("%Y", gmtime())), int(strftime("%m", gmtime())))[1]
today = strftime("%d", gmtime())
lastDay == today

Выход:

False

Если это не последний день месяца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...