减去转换为日期时间对象的字符串

Subtracting a string converted into a datetime object

我有一段代码,它接受 24 小时制的输入,例如 23:59,并打印还剩多少时间,所以如果早上是 11:59,它会return 12 小时。

到目前为止我已经能够做到这一点,但我现在无法判断这段代码出了什么问题:

from datetime import datetime

def timeuntil(t): 
    time = t
    future = datetime.strptime(time, '%H:%M').replace(day = datetime.now().day, year = datetime.now().year, month = datetime.now().month)
    timeleft = (future - datetime.now())
    return timeleft

供您参考,print(timeuntil(22:00)) return 我在 运行 下午 运行 编辑了 15:55:01.996377

感谢您的帮助。

我相信您想要到达第二天的秒数。我发现使用时间模块和直接计算更容易理解。

import time
secs_in_day          = 60*60*24
secs_time_left_local = secs_in_day - (time.time() - time.altzone) % secs_in_day
hours                = int(secs_time_left_local // 3600)
minutes              = int((secs_time_left_local % 3600) // 60)
seconds              = int((secs_time_left_local % 3600) % 60)
print(f'{hours:02}:{minutes:02}:{seconds:02}')

    

这个问题在我的机器上似乎无法重现,即使在将 datetime 对象定义为您指定的时间时也是如此。但是,这可能与 datetime.

上的 replace() 有关

确实没有这个必要,我认为你最好正确地创建一个datetime对象。下面解决了问题并按您的预期工作。

def timeuntil(begin):
    hour, minute = map(int, begin.split(':'))
    now = datetime.now()
    future = datetime(now.year, now.month, now.day, hour, minute)
    return (future - now)

print(timeuntil("23:59"))
#7:35:06.022166

如果您想为 运行 指定一个不同的时区,我们可以用一个时区定义我们的 datetime.now(),但是我们需要去掉这个来计算 future - now .

def timeuntil(begin):
    hour, minute = map(int, begin.split(':'))
    now = datetime.now(timezone('US/Pacific')).replace(tzinfo=None)
    future = datetime(now.year, now.month, now.day, hour, minute)
    return (future - now)