2010-04-15 18 views
4

Nous essayons de créer une fonction de calendrier en python. Nous avons créé un petit système de gestion de contenu, l'exigence est, il y aura une liste déroulante dans le coin supérieur droit du site, qui donnera les options - Mois - 1 mois, 2 mois, 3 mois et ainsi de suite. .., si l'utilisateur sélectionne 8 mois, il devrait afficher le nombre de posts pour les 8 derniers mois. le problème est que nous avons essayé d'écrire un petit code qui ferait les calculs du mois, mais le bug est qu'il ne considère pas les mois au-delà de l'année en cours, il montre le postscount seulement pour les mois de l'année en cours. Par exemple: si l'utilisateur sélectionne 3 mois, il affichera le compte pour les 3 mois, c'est-à-dire le mois présent et les 2 mois précédents, mais si l'utilisateur sélectionne l'option plus de 4 mois, il ne considère pas les mois de l'année précédente, il montre toujours le mois de l'année actuelle seulement.calendrier python pour calculer le mois en arrière

Je coller le code ci-dessous: -


def __getSpecifiedMailCount__(request, value): 

    dbconnector= DBConnector() 
    CdateList= "select cdate from mail_records" 

    DateNow= datetime.datetime.today() 
    DateNow= DateNow.strftime("%Y-%m") 
    DateYear= datetime.datetime.today() 
    DateYear= DateYear.strftime("%Y") 
    DateMonth= datetime.datetime.today() 
    DateMonth= DateMonth.strftime("%m") 

    #print DateMonth 


    def getMonth(value): 
     valueDic= {"01": "Jan", "02": "Feb", "03": "Mar", "04": "Apr", "05": "May", "06": "Jun", "07": "Jul", "08": "Aug", "09": "Sep", "10": "Oct", "11": "Nov", "12": "Dec"} 
     return valueDic[value] 


    def getMonthYearandCount(yearmonth): 
     MailCount= "select count(*) as mailcount from mail_records where cdate like '%s%s'" % (yearmonth, "%") 
     MailCountResult= MailCount[0]['mailcount'] 
     return MailCountResult 


    MailCountList= []  
    MCOUNT= getMonthYearandCount(DateNow) 
    MONTH= getMonth(DateMonth) 
    MailCountDict= {} 
    MailCountDict['monthyear']= MONTH + ' ' + DateYear 
    MailCountDict['mailcount']= MCOUNT 
    var_monthyear= MONTH + ' ' + DateYear 
    var_mailcount= MCOUNT 
    MailCountList.append(MailCountDict) 


    i=1 
    k= int(value) 
    hereMONTH= int(DateMonth) 

    while (i < k): 
     hereMONTH= int(hereMONTH) - 1 
     if (hereMONTH < 10): 
      hereMONTH = '0' + str(hereMONTH) 
     if (hereMONTH == '00') or (hereMONTH == '0-1'): 
      break 
     else: 
      PMONTH= getMonth(hereMONTH) 
      hereDateNow= DateYear + '-' + PMONTH 
      hereDateNowNum= DateYear + '-' + hereMONTH 
      PMCOUNT= getMonthYearandCount(hereDateNowNum) 
      MailCountDict= {} 
      MailCountDict['monthyear']= PMONTH + ' ' + DateYear 
      MailCountDict['mailcount']= PMCOUNT 
      var_monthyear= PMONTH + ' ' + DateYear 
      var_mailcount= PMCOUNT 
      MailCountList.append(MailCountDict) 
     i = i + 1 


    #print MailCountList     

    MailCountDict= {'monthmailcount': MailCountList}  
    reportdata = MailCountDict['monthmailcount'] 
    #print reportdata 
    return render_to_response('test.html', locals()) 

Répondre

-2

Vous pouvez utiliser timedelta dans le module datetime à soustraire mois.

from datetime import datetime, timedelta 

now = datetime.now() 
four_months_ago = now - timedelta(days=(4*365)/12) 

Cela permet de garder une trace de reculer d'un an en cas de besoin ...

>>> january_first = datetime(2009, 1,1) 
>>> january_first - timedelta(days=(4*365)/12) 
datetime.datetime(2008, 9, 2, 0, 0) 
+0

Hey mon pote, tu as résolu mon problème, l'homme merci. J'ai fait marcher les choses. – Suhail

+0

Vous pouvez cliquer sur le bouton cocher situé à gauche de ma réponse pour la marquer comme la réponse «acceptée». –

+0

Cela échouera si vous comptez à rebours si vous incluez le mois de février puisque vous calculerez en janvier pour le mois de février. Habituellement, ce ne sera pas un problème, mais vous ne voulez pas qu'il échoue où aujourd'hui = 1er ou 2 mars, non? Y a-t-il un moyen facile de savoir quel mois il y a "n mois" était? –

1

Ceci est un problème délicat parce mois ont des longueurs différentes. Qu'est-ce que le 31 juillet moins un mois? J'avais une exigence similaire, mais j'ai fait l'hypothèse simplificatrice que j'ai toujours voulu le premier jour du mois, il y a n mois. Dans le cas où il est utile pour vos besoins, la voici:

from datetime import date 

def add_months(start_date, months): 
    return date(
     start_date.year + (start_date.month - 1 + months)/12, 
     (start_date.month - 1 + months) % 12 + 1, 
     1) 
6

La fonction relativedelta dans le paquet python-dateutil fait le tour:

from dateutil.relativedelta import * 
import datetime 

five_months_ago = datetime.datetime.now() - relativedelta(months=5) 
+0

Cela nécessite un paquet supplémentaire: [python-dateutil] (http://labix.org/python-dateutil). – orchistro

Questions connexes