Обработка високосных лет в Python - PullRequest
3 голосов
/ 16 марта 2011

У меня есть программа, в которой пользователь вводит дату, а затем сравнивает ее с другой датой, чтобы узнать, какая из них стоит первой.

Как мне написать код, в котором пользователь вводит 29 февраля, а программа возвращает 28 февраля (поскольку високосного года нет)?

Пример:

def date(prompt):
''' returns the date that user inputs and validates it'''  
while True:
    try:
        date = raw_input(prompt)
        if len(date) >= 5:
            month = date[0:2]
            day = date[3:5]
        dateObject = datetime.date(2011, int(month), int(day))
        return dateObject
    except ValueError:
            print "Please enter a valid month and day"

Ответы [ 2 ]

5 голосов
/ 22 ноября 2011

Если вы проверяете, что: month == 2 and day == 29 избыточно также проверять, является ли это високосным годом с calendar.isleap () .date / datetime повысил бы ValueError, если бы он был установлен на 29 февраля в не-високосный год.

4 голосов
/ 16 марта 2011

Как вы сравниваете даты? Если вы используете функции datetime, то это уже должно учитывать такие вещи.

>>> datetime.datetime(2011, 2, 28)
datetime.datetime(2011, 2, 28, 0, 0)

>>> datetime.datetime(2011, 2, 29)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: day is out of range for month

>>> datetime.datetime(1600, 2, 29)
datetime.datetime(1600, 2, 29, 0, 0)

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

>>> datetime.datetime(2011, 2, 28) + datetime.timedelta(days=10)
datetime.datetime(2011, 3, 10, 0, 0)

>>> datetime.datetime(1600, 2, 28) + datetime.timedelta(days=10)
datetime.datetime(1600, 3, 9, 0, 0)

>>> datetime.datetime(2011, 2, 28) - datetime.datetime(2011, 4, 10)
datetime.timedelta(-41)

Не знаю, как это вписывается в ваш код, но это может быть вариант; -)

...