在python中计算具有独特天数的日期之间的天数

问题描述


from datetime import datetime

x = input("first date: ")

y = input("second date: ")


a = datetime.strptime(x,"%Y/%m/%d")

b = datetime.strptime(y,"%Y/%m/%d")


result = (a-b).days


print("days: ",result)


# my first date is = 2021/2/8

# my second date is = 2021/1/24

# output = days : 15

如你所见,这段代码中一切都很好,但我的老师向我提出了挑战。他说你能不能写一段代码,在几个月里有不寻常的日子。例如:一月有 31 天,但我希望它是 41 天等等。

我现在该怎么办? (请不要说:将输出与 10 相加,因为用户输入可能是可变的,我应该以月为单位更改所有天数,这样就行不通了)

我在编码方面是业余的,所以简单的解释会更好。

So I am looking for something like this :

# if January have 41 days instead of 31 days

# my first date is = 2021/2/8

# my second date is = 2021/1/24

# output will be = days : 15 + 10 = 25

解决方法

您可以制作由月份及其自定义日期组成的字典(例如,'1':41 表示第一个月由 41 天组成)。然后你需要做的就是加上第一个月的输入日期,减去当月的总天数和输入日期的天数。 (假设第一个日期总是大于第二个)。

months = {
'1': 41,'2': 38,'3': 24,...
...
'12': 45,}

x = input("first date: ")
y = input("second date: ")

a = list(x.split('/'))
b = list(y.split('/'))

# 2021/2/8
# ['2021','2','8']

result = int(a[2]) + (months[b[1]] - int(b[2]))
print(result)
,

我认为你已经接近答案了。 您不想“将输出与 10 相加”,但为什么不呢? 问题的答案是“结果 + extra_days”(即输出总和 + 偏移量)。 因此,不是您想要偏移量的 '10',偏移量是 maxDayOfMonth +/- requestsDate

Here 是一个相关的帖子,它提供了一个函数来获取任何一个月的最后一天:

def last_day_of_month(any_day):
    # this will never fail
    # get close to the end of the month for any day,and add 4 days 'over'
    next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
    # subtract the number of remaining 'overage' days to get last day of current month,or said programattically said,the previous day of the first of next month
    return next_month - datetime.timedelta(days=next_month.day)

为您的问题找到一个场景总是有帮助的,例如: 您的老师发现了一个替代宇宙,其中一个月中的天数是可变的,他想使用 datetime 库来工作。 :)