Python календарь для расчета месяца назад - PullRequest
4 голосов
/ 15 апреля 2010

мы пытаемся создать функцию календаря в Python. мы создали небольшую систему управления контентом, требование заключается в том, что в верхнем правом углу веб-сайта будет раскрывающийся список, в котором будут указаны параметры - Месяцы - 1 месяц, 2 месяца, 3 месяца и т. .., если пользователь выбирает 8 месяцев, он должен показать количество сообщений за последние 8 месяцев. проблема в том, что мы попытались написать небольшой код, который выполнял бы вычисления за месяц, но ошибка в том, что он не учитывает месяцы после текущего года, он показывает количество сообщений только за месяцы текущего года.

например: если пользователь выбирает 3 месяца, он будет показывать счет за l 3 месяца, т.е. текущий месяц и предыдущие 2 месяца, но если пользователь выберет опцию более 4 месяцев, он не будет учитывать месяцы с в предыдущем году он по-прежнему показывает только месяц текущего года.

Я вставляю код ниже: -


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

Ответы [ 3 ]

7 голосов
/ 03 мая 2011

Функция относительной дельты в пакете python-dateutil делает свое дело:

from dateutil.relativedelta import *
import datetime

five_months_ago = datetime.datetime.now() - relativedelta(months=5)
1 голос
/ 19 августа 2010

Это неловкая проблема, потому что месяцы имеют разную продолжительность. Что такое 31 июля минус один месяц? У меня было подобное требование, но я сделал упрощающее предположение, что я всегда хотел первый день месяца, n месяцев назад. Если это полезно для ваших требований, вот оно:

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)
0 голосов
/ 15 апреля 2010

Вы можете использовать timedelta в модуле datetime для вычитания месяцев.

from datetime import datetime, timedelta

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

Это будет отслеживать переход на год назад, когда это необходимо ...

>>> january_first = datetime(2009, 1,1)
>>> january_first - timedelta(days=(4*365)/12)
datetime.datetime(2008, 9, 2, 0, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...