Как проверить, действительна ли дата високосного года - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь проверить, является ли дата действительной, но я застрял при попытке выяснить, действительна ли дата високосного года. Я продолжаю получать это сообщение, которое говорит:

ПОСЛЕДНЯЯ РАБОТА 02/11/2018, 12:49:03 Ваша функция сказала, что 29/2/1754 является действительным, но это недействительно.

Я знаю, что это не високосный год. Я пытаюсь возвращать значение False каждый раз, когда год не является високосным, в функции validDate.

Любая информация, которую вы можете дать мне, будет принята с благодарностью. Спасибо

def isLeapYear(y):
    assert y > 1753, False
    return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)


def daysIn(y, m):
    assert 1 <= m <= 12, False
    if m == 9 or m == 4 or m == 6 or m == 11:
        return 30
    elif m == 1 or m == 'March' or m == 'May' or m == 'July':
        return 31
    elif m == 8 or m == 10 or m == 12 or m == 3 or m == 5 or m == 7:
        return 31
    elif m == 2 and isLeapYear(y) is True:
        return 29
    elif m == 2 and isLeapYear(y) is False:
        return 28
    else:
        return False


def validDate(y, m, d):

    try:
        if daysIn(y, m) and isLeapYear(y):
            return True
    except AssertionError:
        return False

    if y > 1753 and 1 <= m <= 12 and 1 <= d <= 31:
        return True
    elif y == isLeapYear(y) and m == 2 and d == 29:
        return False
    else:
        return False


if __name__ == "__main__":
    isLeapYear(2012)
    daysIn(2012, 10)
    validDate(1752, 10, 10)

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Проблема в функции validDate, где вы не проверяете день, а только если в месяце есть дни (что верно для каждого месяца).

def validDate(y, m, d):
    assert 1 <= d <= daysIn(y, m)

или если validDate должен вернуть логическое значение, попробуйте:

def validDate(y, m, d):
    if y <= 1754:
        return False
    if not (1 <= m <= 12):
        return False
    if m in (1, 3, 5, 7, 8, 10, 12):
        days = 31
    elif m == 2:
        leap = y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)
        days = 29 if leap else 28
    else:
        days = 30
    return 1 <= d <= days
0 голосов
/ 02 ноября 2018

Вы можете использовать стандартный модуль datetime библиотеки.

from datetime import date

def validDate(y, m, d):
    try:
        date(y, m, d)
        return True
    except ValueError:
        return False
...