我正在尝试使用django构建日历视图,并尝试避免在视图中编写任何html标记。我发现了一个帮助我到达那里的代码,
from datetime import date, datetime, timedelta, time
import calendar
year=2011
month=12
change=None
# init variables
cal = calendar.Calendar()
month_days = cal.itermonthdays(year, month)
lst = [[]]
week = 0
# make month lists containing list of days for each week
# each day tuple will contain list of entries and 'current' indicator
for day in month_days:
lst[week].append((day))
if len(lst[week]) == 7:
lst.append([])
week += 1
在我看来,我做了以下
<div class="calendar_panel_bottom_noborder">
<span class="month">Juny 2011</span>
<span class="day_name">S</span>
<span class="day_name">M</span>
<span class="day_name">T</span>
<span class="day_name">W</span>
<span class="day_name">T</span>
<span class="day_name">F</span>
<span class="day_name">S</span>
{% for week in month_days %}
{% for day in week %}
<span class="date">{{ day }}</span>
{% endfor %}
{% endfor %}
<div class="clear"></div>
</div>
现在,上面的代码是根据月份和年份参数打印日历,但它们看起来是错误的。当我将它与日历进行比较时,使用2011年12月,本月的第一天从周四开始,而日历则从周三开始。任何人都可以帮助指出我在这里做错了吗?
更新
似乎问题来自itermondaydays。我试着做以下
>>> month_days = cal.itermonthdays(2011, 12)
>>> for day in month_days:
... print day
...
0
0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0
我不知道是否应该更改某种设置或以不同方式启动课程。但是,输出应该以4个零开始,并且根据我的PC日历结束,它表示2011年12月开始于星期四,也就是一周的第5天,因此在计数开始之前应该有4个零。关于如何解决这个问题的任何建议?
答案 0 :(得分:3)
您需要包含
cal.setfirstweekday(6)
之前
monthdays = ...
根据python documentation,......
默认情况下,这些日历将星期一作为一周的第一天, 和星期日是最后一次(欧洲会议)。
答案 1 :(得分:1)
在我看来,你的问题只是itermonthdays
从星期一而不是星期日开始。您可以通过暂时替换
itermonthdays
与
itermonthdates
和
lst[week].append(day)
与
lst[week].append(day.strftime("%A")))
这应该暂时将日期代码替换为星期几的名称。
修改:问题的一个可能解决方案是将lst
初始化为[[0]]
,然后在循环结束时设置lst=lst[:-1]
。
答案 2 :(得分:0)
当我将它与日历进行比较时,使用2011年12月,本月的第一天从星期四开始,而日历则从星期三开始。任何人都可以帮助指出我在这里做错了吗?
根据我的Windows日历,2011年12月的第一天是星期四,我对你不好了。