判断是否为闰年并进行设置

5 投票
1 回答
4529 浏览
提问于 2025-04-17 12:16

我有一个表单,里面有一个初始的 end_date。因为今年是闰年,而且现在是二月份,所以我遇到了一个值错误。

我的代码设定了结束日期为30号,但我不知道怎么写代码来判断今年是否是闰年,并把初始的 end_date 设置为二月份的最后一天。

这是我的 forms.py 文件,它控制着 end_date 的初始值。

class MaturityLetterSetupForm(forms.Form):
def __init__(self, *args, **kwargs):
    from datetime import datetime
    today = datetime.today()
    start_year = today.year
    start_month = today.month
    start_date = datetime(start_year, start_month, 1)
    try:
        end_date = datetime(start_year, start_month, 30)
    except ValueError:
        end_date = datetime(start_year, start_month, ?)

    super(MaturityLetterSetupForm, self).__init__(*args, **kwargs)
    self.fields['start_date'] = forms.DateField(initial=start_date.strftime("%B %d, %Y"),
        widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))

    self.fields['end_date'] = forms.DateField(initial=end_date.strftime("%B %d, %Y"),
        widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))

编辑 在和 @Paul 讨论后,我的初始化变成了:

def __init__(self, *args, **kwargs):
    from datetime import datetime
    import calendar
    today = datetime.today()
    start_year = today.year
    start_month = today.month
    start_date = datetime(start_year, start_month, 1)
    if calendar.isleap(start_year) and today.month == 2:
        end_date = datetime(start_year, start_month, calendar.mdays[today.month]+1)
    else:
        end_date = datetime(start_year, start_month, calendar.mdays[today.month])
    super(MaturityLetterSetupForm, self).__init__(*args, **kwargs)
    self.fields['start_date'] = forms.DateField(initial=start_date.strftime("%B %d, %Y"),
        widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))

    self.fields['end_date'] = forms.DateField(initial=end_date.strftime("%B %d, %Y"),
        widget=forms.TextInput(attrs={'class':'datepicker', 'value': today }))

这个代码可以找到当前月份的最后一天。

1 个回答

11

那你觉得 calendar.isleap(year) 这个方法怎么样呢?

另外,不要用 try/except 来处理这个问题,而是用 if 条件语句。可以这样写:

if calendar.isleap(year):
    do_stuff
else:
   do_other_stuff

撰写回答