Выяснить, является ли это високосным годом и установить соответственно - PullRequest
4 голосов
/ 03 февраля 2012

У меня есть форма с начальным значением end_date. У меня ошибка Value, потому что этот год - високосный, а сейчас у нас февраль.

Мой код имеет конечный день 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 }))

EDIT После разговора с @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 Ответ

8 голосов
/ 03 февраля 2012

Как насчет calendar.isleap (год) ?

Кроме того, не используйте try / кроме как для обработки, но if условно. Что-то вроде:

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