是否有更简单的代码来定义next_date?

时间:2014-03-28 16:51:29

标签: python tuples

给出的任务:我需要从当前日期(d,m,y)获取下一个日期并返回一个整数元组(日,月,年)。

这是我的代码:

def next_date(d, m, y):
    if m == 12 and d == 31:
        d, m, y = 1, 1, y+1
    elif m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m== 10:
        if d == 31:
            d, m, y = 1, m+1, y
        elif d > 31:
            return 'No such date exist'
        else:
            d, m, y = d + 1, m, y
    elif m== 4 or m == 6 or m == 9 or m == 11:
        if d == 30:
            d, m, y = 1, m+1, y
        elif d > 30:
            return 'No such date exist'
        else:
            d, m, y = d+1, m, y
    elif m == 2:
        if is_leap_year(y) and d == 29:
            d, m, y = 1, 3, y
        elif is_leap_year(y) and d == 28:
            d,m,y = 29, m, y
        if not is_leap_year(y):
           if d == 28:
                d, m, y = 1, 3, y
            if d > 28:
                return 'No such date exist'

    else:
        d, m, y = d + 1, m, y
    return (d,m,y)

是否有比这更简单的代码,以至于它不会给我一个无限循环? 非常感谢。

3 个答案:

答案 0 :(得分:1)

import datetime

def next_date(d, m, y):
    given_day = datetime.date(y, m, d)
    next_day = today + datetime.timedelta(days=1)
    return next_day.day, next_day.month, next_day.year

一个标准的小型图书馆,让您的生活更轻松:D检查THIS

答案 1 :(得分:1)

尝试使用Python的datetime模块:

import datetime

def next_date(d, m, y):
    date = datetime.datetime(d,m,y)
    date += datetime.timedelta(days=1)
    return (date.day, date.month, date.year)

答案 2 :(得分:1)

如果您不允许使用库,则可以使用较短的库:

def next_date(d, m, y):
    days = [31,28,31,30,31,30,31,31,30,31,30,31]
    if is_leap_year(y):
        days[1] = 29

    if d < 1 or d > days[m-1] or m < 1 or m > 12:
        return "No such date exist"

    d += 1
    if d > days[m-1]:
        d, m = 1, m+1
        if m > 12:
            d, m, y = 1, 1, y+1

    return (d,m,y)

您可以使用以下方法进行测试:

print next_date(10, 2, 2014)
print next_date(28, 2, 2014)
print next_date(29, 2, 2014)
print next_date(31, 12, 2014)

此外,这是一个您未实现的is_leap_year的简单实现:

def is_leap_year(y):
    return y % 4 == 0 and (y % 100 != 0 or y % 400 == 0)