254 votos

¿Cómo se calcula la fecha seis meses desde la fecha actual usando el módulo de Python datetime?

Estoy usando el módulo de Python datetime. Busco para calcular la fecha de 6 meses desde la fecha actual. ¿Alguien me puede dar un poco de ayuda haciendo esto?

La razón por la que quiero generar una cita 6 meses desde la fecha actual es producir una fecha de revisión. Si el usuario introduce datos en el sistema tendrá una fecha de revisión de 6 meses a partir de la fecha entraron en los datos.

743voto

Mahendra Puntos 2469

He encontrado esta solución será bueno. (Utiliza la extensión python-dateutil, http://labix.org/python-dateutil )

from datetime import date
from dateutil.relativedelta import relativedelta

six_months = date.today() + relativedelta( months = +6 )

La ventaja de este enfoque es que se ocupa de cuestiones con 28,30,31 días etc.. Esto llega a ser muy útil en el manejo de reglas de negocio y escenarios (decir factura generación etc..)

$ date(2010,12,31)+relativedelta(months=+1)
  datetime.date(2011, 1, 31)

$ date(2010,12,31)+relativedelta(months=+2)
  datetime.date(2011, 2, 28)

43voto

vartec Puntos 53382

Bueno, eso depende de lo que te refieres a los 6 meses desde la fecha actual.

1) meses naturales,

   (day,month,year) = (day,(month+6)%12,year+(month+6)/12)

2) definición de banqueros, 6 * 30

   date += datetime.timedelta(6*30)

26voto

kmkaplan Puntos 10338
import datetime
print (datetime.date.today() + datetime.timedelta(6*365/12)).isoformat()

13voto

Johannes Weiß Puntos 19013

¿Qué entiende por '6 meses'. ¿2009-02-13 + 6 meses == 2009-08-13 o es 2009-02-13 + 6 * 30 días?

import mx.DateTime as dt

#6 Months
dt.now()+dt.RelativeDateTime(months=6)
#result is '2009-08-13 16:28:00.84'

#6*30 days
dt.now()+dt.RelativeDateTime(days=30*6)
#result is '2009-08-12 16:30:03.35'

Más info sobre mx.Fecha y hora

11voto

user417751 Puntos 71

Esta solución funciona correctamente para el mes de diciembre, que la mayoría de las respuestas en esta página no. Usted necesita a la primera rotación de los meses a partir de la base 1 (es decir, Jan = 1) a la base de 0 (es decir, Jan = 0) antes de utilizar el módulo ( % ) o división entera ( // ), de lo contrario noviembre (11) más de 1 mes le da 12, que a la hora de encontrar el resto ( 12 % 12 ) da 0.

(No sugerir "(% mes 12) + 1" o Oct + 1 = diciembre!)

def AddMonths(d,x):
    newmonth = ((( d.month - 1) + x ) % 12 ) + 1
    newyear  = d.year + ((( d.month - 1) + x ) / 12 ) 
    return datetime.date( newyear, newmonth, d.day)

Sin embargo ... Esto no cuenta para el problema como Jan 31 + un mes. Así que de vuelta a la OP - ¿qué quieres decir mediante la adición de un mes? Uno soln es dar marcha atrás hasta llegar a un día válido, dado que la mayoría de la gente podría pensar que el último día de enero, más de un mes, es igual al último día de Febrero. Esto funcionará en números negativos de meses. Prueba:

>>> import datetime
>>> AddMonths(datetime.datetime(2010,8,25),1)
datetime.date(2010, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),4)
datetime.date(2010, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),5)
datetime.date(2011, 1, 25)
>>> AddMonths(datetime.datetime(2010,8,25),13)
datetime.date(2011, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),24)
datetime.date(2012, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-1)
datetime.date(2010, 7, 25)
>>> AddMonths(datetime.datetime(2010,8,25),0)
datetime.date(2010, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-12)
datetime.date(2009, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-8)
datetime.date(2009, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-7)
datetime.date(2010, 1, 25)>>> 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X