615 Stimmen

Wie berechne ich mit dem Python-Modul datetime das Datum sechs Monate vor dem aktuellen Datum?

Ich verwende das Python-Modul datetime. Ich möchte das Datum 6 Monate nach dem aktuellen Datum berechnen. Könnte mir jemand ein wenig Hilfe dabei geben?

Der Grund, warum ich ein Datum generieren möchte, das 6 Monate nach dem aktuellen Datum liegt, ist, dass ich eine Datum der Überprüfung . Wenn der Benutzer Daten in das System eingibt, haben diese ein Überprüfungsdatum von 6 Monaten ab dem Datum, an dem er sie eingegeben hat.

2voto

Johnny Utahh Punkte 2219

Von diese Antwort siehe parsedatetime . Es folgt ein Codebeispiel. Mehr Details: Unit-Test mit vielen Beispielen für die Umwandlung von natürlicher Sprache in JJJJ-MM-TT und scheinbar Herausforderungen/Fehler bei der Parsedatetime-Konvertierung .

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time, calendar
from datetime import date

# from https://github.com/bear/parsedatetime
import parsedatetime as pdt

def print_todays_date():
    todays_day_of_week = calendar.day_name[date.today().weekday()]
    print "today's date = " + todays_day_of_week + ', ' + \
                              time.strftime('%Y-%m-%d')

def convert_date(natural_language_date):
    cal = pdt.Calendar()
    (struct_time_date, success) = cal.parse(natural_language_date)
    if success:
        formal_date = time.strftime('%Y-%m-%d', struct_time_date)
    else:
        formal_date = '(conversion failed)'
    print '{0:12s} -> {1:10s}'.format(natural_language_date, formal_date)

print_todays_date()
convert_date('6 months')

Der obige Code generiert das Folgende von einem MacOSX-Rechner:

$ ./parsedatetime_simple.py 
today's date = Wednesday, 2015-05-13
6 months     -> 2015-11-13
$

2voto

Ireneusz Punkte 133

Überarbeitung einer früheren Antwort von user417751. Vielleicht nicht ganz so pythonisch, aber es berücksichtigt unterschiedliche Monatslängen und Schaltjahre. In diesem Fall 31. Januar 2012 + 1 Monat = 29. Februar 2012.

import datetime
import calendar

def add_mths(d, x):
    newday = d.day
    newmonth = (((d.month - 1) + x) % 12) + 1
    newyear  = d.year + (((d.month - 1) + x) // 12)
    if newday > calendar.mdays[newmonth]:
        newday = calendar.mdays[newmonth]
        if newyear % 4 == 0 and newmonth == 2:
            newday += 1
    return datetime.date(newyear, newmonth, newday)

2voto

Babak K Punkte 453

Wie wäre es damit? Keine andere Bibliothek verwenden ( dateutil ) oder timedelta ? Gebäude auf vartec Ich habe dies getan und ich glaube, es funktioniert:

import datetime

today = datetime.date.today()
six_months_from_today = datetime.date(today.year + (today.month + 6)/12, (today.month + 6) % 12, today.day)

Ich habe es mit timedelta sondern weil es die Tage zählt, 365/2 o 6*356/12 entspricht nicht immer 6 Monaten, sondern eher 182 Tagen. z.B.

day = datetime.date(2015, 3, 10)
print day
>>> 2015-03-10

print (day + datetime.timedelta(6*365/12))
>>> 2015-09-08

Ich glaube, dass wir in der Regel davon ausgehen, dass 6 Monate ab einem bestimmten Tag auf denselben Tag des Monats fallen, aber 6 Monate später (d.h. 2015-03-10 --> 2015-09-10 , nicht 2015-09-08 )

Ich hoffe, Sie finden dies hilfreich.

2voto

Bruce Jakeway Punkte 11

Hier ein Beispiel, bei dem der Benutzer entscheiden kann, wie ein Datum zurückgegeben werden soll, bei dem der Tag größer ist als die Anzahl der Tage im Monat.

def add_months(date, months, endOfMonthBehaviour='RoundUp'):
    assert endOfMonthBehaviour in ['RoundDown', 'RoundIn', 'RoundOut', 'RoundUp'], \
        'Unknown end of month behaviour'
    year = date.year + (date.month + months - 1) / 12
    month = (date.month + months - 1) % 12 + 1
    day = date.day
    last = monthrange(year, month)[1]
    if day > last:
        if endOfMonthBehaviour == 'RoundDown' or \
            endOfMonthBehaviour == 'RoundOut' and months < 0 or \
            endOfMonthBehaviour == 'RoundIn' and months > 0:
            day = last
        elif endOfMonthBehaviour == 'RoundUp' or \
            endOfMonthBehaviour == 'RoundOut' and months > 0 or \
            endOfMonthBehaviour == 'RoundIn' and months < 0:
            # we don't need to worry about incrementing the year
            # because there will never be a day in December > 31
            month += 1
            day = 1
    return datetime.date(year, month, day)

>>> from calendar import monthrange
>>> import datetime
>>> add_months(datetime.datetime(2016, 1, 31), 1)
datetime.date(2016, 3, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2)
datetime.date(2015, 12, 1)
>>> add_months(datetime.datetime(2016, 1, 31), -2, 'RoundDown')
datetime.date(2015, 11, 30)

2voto

blacknight12321 Punkte 71

Da Ihre datetime-Variable date heißt:

date=datetime.datetime(year=date.year+int((date.month+6)/12),
                       month=(date.month+6)%13 + (1 if (date.month + 
                       months>12) else 0), day=date.day)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X