from decimal import Decimal
from datetime import timedelta
def duration(duration_string): #example: '5d3h2m1s'
duration_string = duration_string.lower()
total_seconds = Decimal('0')
prev_num = []
for character in duration_string:
if character.isalpha():
if prev_num:
num = Decimal(''.join(prev_num))
if character == 'd':
total_seconds += num * 60 * 60 * 24
elif character == 'h':
total_seconds += num * 60 * 60
elif character == 'm':
total_seconds += num * 60
elif character == 's':
total_seconds += num
prev_num = []
elif character.isnumeric() or character == '.':
prev_num.append(character)
return timedelta(seconds=float(total_seconds))
import datetime
intervals = {
"w": datetime.timedelta(weeks=1),
"d": datetime.timedelta(days=1),
"h": datetime.timedelta(hours=1),
"m": datetime.timedelta(minutes=1),
"s": datetime.timedelta(seconds=1)
}
def parse_live_length(string):
time_interval_start_index = 0
for char in string:
if char.isnumeric():
time_interval_start_index += 1
else:
return int(string[0:time_interval_start_index]), string[time_interval_start_index:]
return False
# "2w" used as an example
live_length = "2w"
time_scalar, ll_interval = parse_live_length(live_length)
for interval in intervals:
if interval == ll_interval:
new_delta = time_scalar * intervals[interval]
break
# Example of how it could be used
current = datetime.datetime.now()
new_time = new_delta + current
print(new_time.day, new_time.month, new_time.year)
我在GitHub上找到了代码:
很好example
您可以使用正则表达式来提取数字/时间单位部分,然后在字典中查找乘法器。通过这种方式,它比your手动解析和
if/elif
链要短一些,而且可能可读性更高。你知道吗作为一个函数:
这也将确保数字部分实际上是一个有效的数字(而不仅仅是任何数字和点的序列)。此外,如果使用了允许的时间单位以外的任何时间单位,它将引发异常。你知道吗
通过在函数外使用
re.compile
预编译regex,可以进一步优化函数。当我用IPython的%timeit
测试它时,我的测试速度要快一点(2.1µs对你的测试速度是2.8µs,两者都没有timedelta
创建,而且只使用float
而不是Decimal
)。另外,我认为这是一个更具可读性,有更多的声明性和更少的命令性风格,但这肯定是一个品味和偏好的问题。你知道吗这是我的解决方案;我使用了python
datetime
库,它是timedelta
:相关问题 更多 >
编程相关推荐