如何解析超过一个月长度的天数?

How can I parse a number of days that exceeds the length of a month?

我制作了一个倒计时功能(效果很好),returns 剩余时间作为字符串。我正在使用 strptimestrftime 函数对数据进行排序,这样我就可以有一个变量来表示剩余的天数、小时数、分钟数和秒数。一旦天数超过 31(因为月份),我的代码就会给我一个错误。有什么办法可以解决吗?

from datetime import datetime, date

a = "31 days, 23:52:51"
b = "32 days, 23:52:51"

d = datetime.strptime(b, "%d days, %H:%M:%S")

t1 = d.strftime("%d")
t2 = d.strftime("%H")
t3 = d.strftime("%M")
t4 = d.strftime("%S")


print(t1)
print(t2)
print(t3)
print(t4)

如果x days中的x不是一个月中的某一天,而只是几天,则不能传递给strptime,必须单独解析.

例如,在第一个 , 上拆分字符串,仅将后半部分传递给 strptime:

num_days, hours = b.split(',', maxsplit=1)

d = datetime.strptime(hours.strip(), "%H:%M:%S")

t1 = int(num_days.split()[0])
t2 = d.strftime("%H")
t3 = d.strftime("%M")
t4 = d.strftime("%S")

此外,如果您想使用 t2t3t4 作为数字,您应该使用

t2 = d.hour
t3 = d.minute
t4 = d.second

感谢所有回答我的人,我以可以想象到的最愚蠢的方式自己分析了这些日子!所以我就这样走了:

index = b.find("days")
d = datetime.strptime(b[index:], "days, %H:%M:%S")
days = int(b[0:index - 1])

如果它是 'day' 而不是 'days',我添加了一个 if/else 块来确保。谢谢大家!

我认为您可以使用 timedelta class 并在其中存储您的日期。然后你可以从中提取一天之后的几天和几秒钟。从这几秒钟开始,您可以使用模除法得到小时、分钟和秒。

from datetime import datetime, date, timedelta

a = "31 days, 23:52:51"
b = "32 days, 23:52:51"


d = timedelta(days=float(b[0:2]), hours=float(b[9:11]), minutes=float(b[12:14]), 
seconds=float(b[15:]) )

print(d.days)
print(d.seconds // 3600)
print(d.seconds % 3600 //60)
print(d.seconds % 60)

没有一个月有 32 天,因此你的错误。但是,对于时差,只需使用 timedelta。您可以自由地将时间增量添加到 datetime 对象。

import re
from datetime import datetime, timedelta

now = datetime.now()

r = "^(\d+) days?, (\d+):(\d+):(\d+)$"

cases = ["1 day, 11:12:13", "31 days, 23:52:51", "32 days, 23:52:51"]

for s in cases:
    m = re.match(r, s)
    days, hours, minutes, seconds = [int(x) for x in m.groups()]
    td = timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)
    print(td)  # gives you the intended output (use str(td) if you want the string)
    # the code below duplicates that print manually 
    days2 = td.days
    hours2, seconds2 = divmod(td.seconds, 3600)
    minutes2, seconds2 = divmod(seconds2, 60)
    print(f'{days2} day{"s" if 1 < days2 else ""}, {hours2}:{minutes2:0>2}:{seconds2:0>2}')
    # and finally the print of the datetime object made of current time plus our time delta
    print(now+td)

输出(会根据你的时钟改变):

1 day, 11:12:13
1 day, 11:12:13
2021-08-12 23:23:33.986973
31 days, 23:52:51
31 days, 23:52:51
2021-09-12 12:04:11.986973
32 days, 23:52:51
32 days, 23:52:51
2021-09-13 12:04:11.986973