views:

167

answers:

2

Hi, we are trying to create a calendar function in python. we have created a small content management system, the requirement is, there will be a drop down list on the top right hand corner of the website, which will give the options - Months - 1 month, 2 months, 3 months and so on..., if the user selects 8 months then it should show the postscount for the last 8 months. the issue is we tried to write a small code which would do the month calculations, but the bug is that it does not consider the months beyond the current year, it shows the postscount only for months of the current year.

for example: if the user selects 3 months, it will show the count for the l 3 months i.e present month and the previous 2 months, but if the user selects option more than 4 months, it does not consider the months from previous year, it still shows the month of the present year only.

I am pasting the code below:-


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())

A: 

You can use timedelta in the datetime module to subtract months.

from datetime import datetime, timedelta

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

This will keep track of moving back a year when necessary...

>>> january_first = datetime(2009, 1,1)
>>> january_first - timedelta(days=(4*365)/12)
datetime.datetime(2008, 9, 2, 0, 0)
T. Stone
Hey buddy, you solved my problem, thanks man. i got the things working.
Suhail
You can click on the check button to the left of my answer to mark it as the "accepted" answer
T. Stone
This will fail when counting backwards if you ever include February since you'll calculate into January for February.Usually it won't be an issue, but you don't want it to fail where today = March 1st or 2nd, right?Is there no easy way to find out what month "n months ago" was?
Jough Dempsey
@Jough -- If only there was a `timedelta(months=X)`, but alas there's not.
T. Stone
+1  A: 

This is an awkward problem because months have different lengths. What is July 31 minus one month? I had a similar requirement, but I made the simplifying assumption that I always wanted the first day of the month, n months ago. In case it's helpful for your requirements, here it is:

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)
Don Kirkby