Timedelta 输出问题

Timedelta ouput issue

我的代码:

from datetime import datetime

def timedelta_calc(timeone, timetwo):
    chars = ['AM', 'PM']
    for i in chars:
        timeone = timeone.replace(i, '')
        timetwo = timetwo.replace(i, '')
    FMT = '%H:%M'
    tdelta = datetime.strptime(timetwo, FMT) - datetime.strptime(timeone, FMT)
    return str(tdelta)

print(timedelta_calc('10:15PM', '11:15PM'))

在我上面显示的代码中,我们将 10:15PM11:15PM 送入函数,输出是预期的 1:00:00(大部分情况下,格式应该删除秒列)。但是对于这样的时间增量函数,您从 (timetwo) 中减去的时间总是期望更高。这导致了

等问题

timeone = '10:15PMtimetwo = '1:15AM'

输出:

-1 day, 15:00:00

即使增量应该是 3 小时,输出也没有显示。我使用的时间字符串示例通常不是使用 datetime 模块时给出的。我正在使用:

def get_time():
    timezone = pytz.timezone('')#tz removed for privacy reasons
    time = datetime.now(timezone)
    time = time.strftime('%H:%M')
    hours, minutes = time.split(":")
    hours, minutes = int(hours), int(minutes)
    setting = "AM"
    if hours > 12:
        setting = "PM"
        hours -= 12
    return str(("%02d:%02d" + setting) % (hours, minutes)).replace(' ', '')

这只是使用 24 小时军用时间的日期时间对象,并将其转换为正常时间,并在末尾粘上 AM 或 PM,因为它应该是正常时间。在我的 timedelta 函数中很容易看出的是

的使用
chars = ['AM', 'PM']
    for i in chars:
        timeone = timeone.replace(i, '')
        timetwo = timetwo.replace(i, '')

删除非 int 字符,只用正常时间提供 datetime.strptime。 现在,根据 datetime 模块的经验,即使给定 24 小时(我假设。我可能完全错了),第二天也会出现相同的输出问题,例如 23:301:30。据我所知,日期时间模块不包含任何有助于解决此问题的内容。

正如您从标题中看到的那样,我什至不知道如何称呼这个问题。我的代码有问题吗?或者任何人都可以提供解决此问题的方法吗?

进一步研究,我可以看出这不是日期时间错误,因为提供的时间没有附加日期,这可能有助于解决问题。但一般来说,应该假设操作应该基于它们在 datetime.striptime 中的放置方式,第一个给定时间 obj 是 timetwo(或最后一个取决于你们想出什么)因为它两个值中较大的一个。 timeone 是 strptime 中的第二个给定时间 obj,因为它较小并假定为增量的开始。

将根据需要更新任何信息,请询问。我是新来的,所以请放轻松!谢谢你的时间

在您的示例““10:15PM”与“1:15AM””中,您假设第二个“较小”时间来自 第二天 - 所以实际上,您假设这些值/时间实例沿着(严格且)单调递增的时间轴出现。您可以通过添加一天来说明这一点:

from datetime import datetime, timedelta

def abs_timediff(timeone, timetwo):
    t1, t2 = datetime.strptime(timeone, "%I:%M%p"), datetime.strptime(timetwo, "%I:%M%p")
    if t2 > t1: # same day
        return t2-t1
    return (t2+timedelta(1))-t1 # assume t2 is on next day, so add one


for tone, ttwo in zip(('10:15PM', "10:15PM"), ('11:15PM', '1:15AM')):
    print(tone, ttwo, "diff:", abs_timediff(tone, ttwo))
    
# 10:15PM 11:15PM diff: 1:00:00
# 10:15PM 1:15AM diff: 3:00:00

相关:Comparing two times without date in Python, and for the timedelta arithmetic on it's own: Python timedelta behaviour on subtraction.