Python日历向后计算月份
我们正在尝试在Python中创建一个日历功能。我们已经建立了一个小型的内容管理系统,需求是网站右上角会有一个下拉列表,里面有选项 - 月份 - 1个月、2个月、3个月等等。如果用户选择了8个月,那么就应该显示过去8个月的帖子数量。问题是我们写了一段小代码来进行月份的计算,但出现了一个bug,它没有考虑到当前年份以外的月份,只显示当前年份的月份的帖子数量。
举个例子:如果用户选择了3个月,它会显示最近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 个回答
1
这个问题有点棘手,因为每个月的天数不一样。那么,7月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)
7
python-dateutil这个包里的relativedelta函数可以解决这个问题:
from dateutil.relativedelta import *
import datetime
five_months_ago = datetime.datetime.now() - relativedelta(months=5)
-2
你可以在 datetime
模块中使用 timedelta
来减去月份。
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)