如何解析超过一个月长度的天数?
How can I parse a number of days that exceeds the length of a month?
我制作了一个倒计时功能(效果很好),returns 剩余时间作为字符串。我正在使用 strptime
和 strftime
函数对数据进行排序,这样我就可以有一个变量来表示剩余的天数、小时数、分钟数和秒数。一旦天数超过 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")
此外,如果您想使用 t2
、t3
、t4
作为数字,您应该使用
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
我制作了一个倒计时功能(效果很好),returns 剩余时间作为字符串。我正在使用 strptime
和 strftime
函数对数据进行排序,这样我就可以有一个变量来表示剩余的天数、小时数、分钟数和秒数。一旦天数超过 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")
此外,如果您想使用 t2
、t3
、t4
作为数字,您应该使用
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