2016-04-15 27 views
1

Ich benutze die Variable current_month, um Daten abzufragen, aber hier ist der Haken - wenn der Tag im Monat später als der 15. ist, möchte ich den setzen Der aktuelle Monat ist der folgende Monat. Daher sollte der aktuelle Monat für den 16.04.2016 der 1.5.2016 sein. Ich habe Code, der funktioniert, aber es fühlt sich nicht pythonisch an. Vorschläge würden geschätzt werden.Ermitteln der aktuellen Monat Variable, die nach dem 15. Tag zum nächsten Monat rollt - Python 2.7

month = datetime.datetime.now().strftime("%m") 
year = datetime.datetime.now().strftime("%Y") 
day = datetime.datetime.now().strftime("%d") 

#Check if day in the month is past 15th if so set current month 
if int(day) > 15: 
    if int(month) < 9: # check if the month in 1-9 if so pad leading zero 
     x = int(month)+1 
     current_month = year+"-0"+str(x)+"-01" 
    if int(month) == 9: # check if the month in 1-9 if so pad leading zero 
    x = int(month)+1 
     current_month = year+"-"+str(x)+"-01" 
    elif int(month) == 12: # check if the month is Dec if so roll to the next year and set month to Jan 
    month = "01" 
    y = int(year)+1 
    current_month = str(y)+"-"+month+"-01" 
    else: 
     x = int(month)+1 # just add one to the month if months are 10 or 11 
    current_month = year+"-"+str(x)+"-01" 
else: 
    current_month = year+"-"+month+"-01" #prior to the 15'th so just use normal year, month and day 
+0

Können Sie nicht einfach 16 Tage zum aktuellen Datum hinzufügen und dann den Tag auf 1 setzen? –

+1

@ScottHunter: Das Hinzufügen von Tagen kann aufgrund unterschiedlicher Tage in verschiedenen Monaten ungenau sein. Es wäre genauer, 15 Tage zu subtrahieren und dann den Tag auf 1 zu setzen und einen Monat hinzuzufügen. – zondo

+0

@zondo: Oder nur tun, wenn die Anpassung benötigt wird –

Antwort

2
# Get today's date/time 
today = datetime.datetime.now() 
# add 16 days if after the 15th 
if today.day > 15: 
    today += datetime.timedelta(16) 
# Format that date w/ day being 1 
current_month = today.strftime("%Y-%m-01") 
+0

elegante Lösung! Danke @ScottHunter –

0

Eine Alternative zu Scotts Ansatz (was sehr gut funktioniert, und Sie sollten es wohl akzeptieren) ist ein verwenden dateutil.relativedelta:

from datetime import datetime 
from dateutil.relativedelta import relativedelta 

def next_month_after_day(dt, trans_day=15): 
    rd = relativedelta(months=(dt.day > trans_day), day=1) 

    return dt + rd 

dt1 = datetime(1996, 2, 3) 
dt2 = datetime(1996, 2, 15) 
dt3 = datetime(1996, 2, 16) 
dt4 = datetime(1996, 12, 18) 

fmt = "%Y-%m-%d" 
for x in (dt1, dt2, dt3, dt4): 
    dt_before = x 
    dt_after = next_month_after_day(x) 
    print('{} -> {}'.format(dt_before.strftime(fmt), dt_after.strftime(fmt))) 

Das Ergebnis ist:

1996-02-03 -> 1996-02-01 
1996-02-15 -> 1996-02-01 
1996-02-16 -> 1996-03-01 
1996-12-18 -> 1997-01-01 

Danke an Scott für den Hinweis, warum mein ursprünglicher Ansatz unnötig kompliziert (und falsch) war.

+0

Ich dachte, der Tag sollte 1 sein, egal was; Die Frage war, wie man den richtigen Monat bekommt. –

+0

@ScottHunter Guter Anruf. Fest. – Paul

+0

Ich schätze, Sie haben nicht für Dezember getestet. –

Verwandte Themen