2016-07-07 3 views
-2

Sie müssen den letzten Donnerstag eines beliebigen Monats bestimmen. Wenn der angegebene Monat der aktuelle Monat ist und der letzte Donnerstag vergangen ist, muss eine Ausnahme ausgelöst werden. Ich versuche, datetime Modul zu verwenden, kann aber keine einfache Möglichkeit finden, dies zu tun.Benötigen Sie das Datum des letzten Donnerstags eines bestimmten Monats in Python?

Edit: scheint wie meine Frage war nicht klar genug. Die Funktion, nach der ich suche, gibt das Datum des letzten Donnerstags eines bestimmten Monats zurück, so dass kein Datum, das auf das zurückgegebene Datum im Monat folgt, ein Donnerstag ist. Das Problem scheint von CrackaJackDev und af3ld effektiv gelöst worden zu sein. Danke für das. Ein großes Dankeschön an Bahrom für wichtige Änderungen und Korrekturen. Ich bin neu in dieser Community, es tut mir so leid, wenn meine Frage nicht gut organisiert war. Ich werde das nächste Mal härter sein.

+0

Ich habe keine Ahnung, was du sagst. Können Sie Ihre Frage etwas näher erläutern? – refi64

Antwort

1

Hier ist eine Version, die auf irgendwelchen externen Pakete hängt nicht:

import datetime, calendar 

def LastThInMonth(year, month): 
    # Create a datetime.date for the last day of the given month 
    daysInMonth = calendar.monthrange(year, month)[1] # Returns (month, numberOfDaysInMonth) 
    dt = datetime.date(year, month, daysInMonth) 

    # Back up to the most recent Thursday 
    offset = 4 - dt.isoweekday() 
    if offset > 0: offset -= 7       # Back up one week if necessary 
    dt += datetime.timedelta(offset)     # dt is now date of last Th in month 

    # Throw an exception if dt is in the current month and occurred before today 
    now = datetime.date.today()       # Get current date (local time, not utc) 
    if dt.year == now.year and dt.month == now.month and dt < now: 
     raise Exception('Oops - missed the last Thursday of this month') 

    return dt 

for month in range(1, 13): print(LastThInMonth(2016, month)) 

2016-01-28 
2016-02-25 
2016-03-31 
2016-04-28 
2016-05-26 
2016-06-30 
2016-07-28 
2016-08-25 
2016-09-29 
2016-10-27 
2016-11-24 
2016-12-29 
1

Für den ersten Teil Ihrer Frage mag ich relativedelta aus der Bibliothek date.utils.

from datetime import date 
from dateutil.relativedelta import relativedelta, TH 

def get_thurs(dt): 
    print (dt + relativedelta(day=31, weekday=TH(-1))) 

get_thurs(date(2016, 7, 7)) 
get_thurs(date(2019, 6, 4)) 


2016-07-28 
2019-06-27 

Für den zweiten Teil, ich glaube, Sie etwas ein bisschen wie diese wollen:

def get_thurs(dt): 
    return (dt + relativedelta(day=31, weekday=TH(-1))) 


def later_date(dt): 
    if dt.month == date.today().month: # checks if in current month 
     if get_thurs(dt).day > dt.day: # checks if last Thurs has passed 
      raise Exception 
     else: 
      print "It is before that Thursday" 


later_date(date(2016, 7, 23)) 
later_date(date(2016, 7, 29)) 


It is before that Thursday 
Traceback (most recent call last): 
    File "calculator/bw_events_cookies/tests/ideas.py", line 31, in <module> 
    later_date(date(2016, 7, 23)) 
    File "calculator/bw_events_cookies/tests/ideas.py", line 26, in later_date 
    raise Exception 
Exception 
Verwandte Themen