【问题标题】:Finding number of days until holidays查找距假期的天数
【发布时间】:2019-10-04 12:02:11
【问题描述】:

所以这是我第一次用 Python 编写代码,我想做一个小项目。我考虑了我想做什么,并认为人们可能想知道每个假期还有多少天。

我应该如何找出今天的日期和假期之间的差异?

from datetime import datetime, timedelta
now = datetime.now() + timedelta(days = 10)

def get_user_holiday():
    holiday = input("What is your favorite holiday? ")

    if holiday == "New Year's Day":
        new_years_Day = datetime(now.year, 1, 1)
    elif holiday == "Martin Luther King Jr. Day":
        martin_luther_king_jr_Day = datetime(now.year, 1, 21)
    elif holiday == "Groundhog Day":
        groundhog_Day = datetime(now.year, 2, 2)
    elif holiday == "Valentine's Day":
        valentines_Day = datetime(now.year, 2, 14)
    elif holiday == "Ash Wednesday":
        ash_Wednesday = datetime(now.year, 3, 6)
    elif holiday == "St. Patrick's Day":
        st_patricks_Day = datetime(now.year, 3, 17)
    elif holiday == "April Fool's Day":
        april_fools_Day = datetime(now.year, 4, 1)
    elif holiday == "Palm Sunday":
        palm_Sunday = datetime(now.year, 4, 14)
    elif holiday == "Good Friday":
        good_Friday = datetime(now.year, 4, 19)
    elif holiday == "Easter Day":
        easter_Day = datetime(now.year, 4, 21)
    elif holiday == "Mother's Day":
        mothers_Day = datetime(now.year, 5, 12)
    elif holiday == "Memorial Day":
        memorial_Day = datetime(now.year, 5, 27)
    elif holiday == "Father's Day":
        fathers_Day = datetime(now.year, 6, 16)
    elif holiday == "Independence Day":
        independence_Day = datetime(now.year, 7, 4)
    elif holiday == "Labor Day":
        labor_Day = datetime(now.year, 9, 2)
    elif holiday == "Columbus Day":
        columbus_Day = datetime(now.year, 10, 4)
    elif holiday == "Halloween Day":
        halloween_Day = datetime(now.year, 10, 31)
    elif holiday == "Veterans Day":
        veterans_Day = datetime(now.year, 11, 11)
    elif holiday == "Thanksgiving Day":
        thanksgiving_Day = datetime(now.year, 11, 28)
    elif holiday == "Hanukkah Day":
        hanukkah_Day = datetime(now.year, 12, 22)
    elif holiday == "Christmas Day":
        christmas_Day = datetime(now.year, 12, 25)
    elif holiday == "New Year's Eve Day":
        new_years_eve_Day = datetime(now.year, 12, 31)
    else:
        print("Not a valid holiday. ")
    return holiday

这就是我将代码编辑成的内容。

from datetime import datetime, timedelta
now = datetime.now()

def get_user_holiday():
    global now
    holiday = input("What is your favorite holiday? ")

    if holiday == "New Year's Day":
        return datetime(now.year, 1, 1)
    elif holiday == "Martin Luther King Jr. Day":
        return datetime(now.year, 1, 21)
    elif holiday == "Groundhog Day":
        return datetime(now.year, 2, 2)
    elif holiday == "Valentine's Day":
        return datetime(now.year, 2, 14)
    elif holiday == "Ash Wednesday":
        return datetime(now.year, 3, 6)
    elif holiday == "St. Patrick's Day":
        return datetime(now.year, 3, 17)
    elif holiday == "April Fool's Day":
        return datetime(now.year, 4, 1)
    elif holiday == "Palm Sunday":
        return datetime(now.year, 4, 14)
    elif holiday == "Good Friday":
        return datetime(now.year, 4, 19)
    elif holiday == "Easter Day":
        return datetime(now.year, 4, 21)
    elif holiday == "Mother's Day":
        return datetime(now.year, 5, 12)
    elif holiday == "Memorial Day":
        return datetime(now.year, 5, 27)
    elif holiday == "Father's Day":
        return datetime(now.year, 6, 16)
    elif holiday == "Independence Day":
        return datetime(now.year, 7, 4)
    elif holiday == "Labor Day":
        return datetime(now.year, 9, 2)
    elif holiday == "Columbus Day":
        return datetime(now.year, 10, 4)
    elif holiday == "Halloween Day":
        return datetime(now.year, 10, 31)
    elif holiday == "Veterans Day":
        return datetime(now.year, 11, 11)
    elif holiday == "Thanksgiving Day":
        return datetime(now.year, 11, 28)
    elif holiday == "Hanukkah Day":
        return datetime(now.year, 12, 22)
    elif holiday == "Christmas Day":
        return datetime(now.year, 12, 25)
    elif holiday == "New Year's Eve Day":
        return datetime(now.year, 12, 31)
    else:
        print("Not a valid holiday. ")
    return holiday

def calculate_dates(holiday, now):
    diff = holiday - now
    if diff.days >= 0:  # holiday is upcoming this year
        return diff.days
    else:  # next holiday occurs next year
        return ((holiday + timedelta(years = 1)) - now).days

hd = get_user_holiday()
now = datetime.now()
calc = calculate_dates(hd, now)

print(calc)

【问题讨论】:

  • 如何退出工作?如果有错误,您需要将其包含在回溯中。参考minimal reproducible example
  • 您总是返回用户输入的字符串,而不是计算的日期(我不确定我是否理解您为什么要加上 10 天或 2000 年)
  • 直截了当的问题,'hd' 包含一个字符串 & 你怎么能期望它具有像日和月这样的属性?
  • 我继续编辑了一些东西,因为返回假期后的一切都以某种方式、形状或形式搞砸了。我只是想知道如何完成代码。
  • 我将 10 天添加到 'timedelta' 以使 'now.year' 显示当前年份,而无需将导入从 'from datetime import datetime' 更改为 'import datetime'。

标签: python python-3.x datetime


【解决方案1】:

首先,您需要返回假期的日期时间对象,例如

now = datetime.now()

def get_user_holiday():
    global now 
    holiday = input("What is your favorite holiday? ")

    if holiday == "New Year's Day":
        return datetime(now.year, 1, 1)

然后,我不确定计算函数中正在执行的数学运算,因为您总是在当前年份加一,这意味着您正在跳过当前年份尚未发生的假期,除非这就是 max() 调用的目的

但我会试试这个

def calculate_dates(holiday, now): 
    diff = holiday - now 
    if diff.days >= 0:  # holiday is upcoming this year 
        return diff.days
    else:  # next holiday occurs next year .timedelta doesn't support years, so this is my workaround 
        return ((holiday + timedelta(days = 365)) - now).days

但是,请记住,某些假期的日期每年都不同,所以这个结果不会真正准确

【讨论】:

  • 我怎么称呼这个?导入此代码时,我不再有输入假期的选项。
  • 所以就像使用新代码一样,我得到了这个错误。回溯(最近一次通话最后):文件“C:/Users/rmulr/.PyCharmCE2018.3/config/scratches/new.py”,第 65 行,在 calc = calculate_dates(hd, now) 文件“C: /Users/rmulr/.PyCharmCE2018.3/config/scratches/new.py",第 57 行,在 calculate_dates 中 diff = holiday - 现在 TypeError:不支持的操作数类型 -:'str' 和 'datetime.datetime'
  • 我看到你得到这个错误的唯一方法是如果你没有正确输入假期,那么你仍然会输入return holiday,这是一个str类型,而不是日期时间
  • 我不知道。这是我得到的错误。 '你最喜欢的节日是什么?情人节回溯(最近一次通话最后):文件“C:/Users/rmulr/.PyCharmCE2018.3/config/scratches/test.py”,第 65 行,在 calc = calculate_dates(hd, now) 文件中“ C:/Users/rmulr/.PyCharmCE2018.3/config/scratches/test.py", line 61, in calculate_dates return ((holiday + timedelta(years = 1)) - now).days TypeError: 'years' is an __new__() 的无效关键字参数进程以退出代码 1' 结束
  • 它只发生在已经发生的假期。劳动节及以上。相信跟else中timedelta的参数有关:return under def calculate_dates。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2013-10-31
相关资源
最近更新 更多