查找下一个日期时间大于5的倍数

2024-04-19 07:38:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找到下一个大于5的datetime,下面是一个示例:

如果实际时间是12:18,变量next应该是12:20,如果是12:20:01,变量next应该有值12:25,依此类推

有没有办法做到这一点?现在我设法做到了:

time = datetime.datetime.now()
min = time.minute
next = 5-(min%5)

print(next)

但这将只计算距离下一个5的倍数还有多少时间。任何建议都将不胜感激


Tags: 距离示例datetimetime时间minnow建议
3条回答

解决方案

试试这个。如果tsdatetime对象

ts.replace(second=0, microsecond=0) + timedelta(minutes=ceil(ts.minute/5)*5)

范例

from math import ceil
from datetime import datetime, timedelta

ts = datetime.now()
print(f'BEFORE: {ts}')
ts = ts.replace(second=0, microsecond=0) + timedelta(minutes=ceil(ts.minute/5)*5)
print(f'AFTER: {ts}')

输出

BEFORE: 2020-05-19 10:41:33.071380
AFTER: 2020-05-19 10:45:00

使用

minutes = [33, 35, 37, 39, 40, 41, 43, 45]
expected = [35, 35, 40, 40, 40, 45, 45, 45]

tests = []
for m, e in zip(minutes, expected):
    err = ceil(m/5)*5 - e
    if err!=0:
        tests.append({'m': m, 'e': e, 'err': err})
if tests:
    print("Tests FAILED: \n")
    for test in tests: print(f" {test}")
else:
    print("ALL Tests PASSED.")

## Output
# ALL Tests PASSED.

像这样的

from datetime import datetime, timedelta

def round_by_five(time):
    if time.second == 0 and time.microsecond == 0 and time.minute % 5 == 0:
        return time
    minutes_by_five = time.minute // 5
    # get the difference in times
    diff = (minutes_by_five + 1) * 5 - time.minute
    time = (time + timedelta(minutes=diff)).replace(second=0, microsecond=0)
    return time

time = datetime.now()
round_by_five(time)

这正是您想要的:

from datetime import datetime
time = datetime.now()
min = (time.minute // 5 + 1) * 5
next = time.replace(minute=0,second=0, microsecond=0)+timedelta(minutes=min)
print(next)

相关问题 更多 >