1

我需要一种方法来找出一个 datetime.time 在另一个 datetime.time 之后有多长时间 很简单,但是......问题是我的时间值是 24 小时制的,所以它不像从另一个值否定一个值那么简单。相反,如果我要及时计数并且在午夜时间循环,我需要计算 time_b 在 time_a 之后多长时间,即

time_a = 09:00
time_b = 04:00

这里 time_b 是 time_a 之后的 19 小时

def time_after_time(time_a, time_b):

    a_hour = time_a.hour
    a_minute = time_a.minute
    b_hour = time_b.hour
    b_minute = time_b.minute

    out_hour = b_hour - a_hour
    out_minute = b_minute - a_minute

    if out_hour < 0:
        out_hour += 24

    if out_minute < 0:
        out_hour -= 1
        out_minute += 60

    return datetime.time(out_hour, out_minute)

这是我的第一次尝试,但它给出了错误的结果。

谁能想到一个更清洁/正确的方法来做到这一点?

4

4 回答 4

1

这是我的解决方案:

def time_after_time(time_a, time_b):
    time_a_min = time_a.hour * 60 + time_a.minute
    time_b_min = time_b.hour * 60 + time_b.minute
    out_min = time_b_min - time_a_min
    if out_min < 0:
        out_min += 24 * 60
    return datetime.time(out_min / 60, out_min % 60)

您可以在codepad.org上对其进行测试。

于 2012-11-05T19:25:40.990 回答
0
timedif = DATETIME_1 - DATETIME_2
print timedif

确保您使用 datetime.datetime 时间...

您可以将 datetime.time 转换为 datetime

datetime.datetime.combine(datetime.datetime.now().date(),datetimeTime_obj)

是 09:00 - 10:00 = 1 小时还是 25 小时?那么最长是24小时吗?

import datetime

time_a = datetime.time(9,00)
time_b = datetime.time(5,0)
dte = datetime.datetime.now().date()

dt_a = datetime.datetime.combine(dte,time_a)

dt_b = datetime.datetime.combine(dte,time_b)
time_dif = dt_b - dt_a
time_dif2 = dt_a - dt_b
print "TimeDif:",time_dif,time_dif2
#output: 20:00:00 , 04:00:00
于 2012-11-05T18:15:12.147 回答
0

根据我的经验,无论何时从外部来源收到基于 24 小时的时间戳,都应立即在内部将其转换为绝对时间,例如从 1970 年开始的秒数。例如,参见Chttps : //stackoverflow.com/a/12859648/318716 的方法来做到这一点。

一旦你这样做了,那么简单的时间减法就变得容易和有效。

如果你这样做,那么最终会出现时间戳相差 48 小时的问题。

例如,如果您正在分析历史存档数据或回放,则此类转换有时不应基于当前日期/时间。

于 2012-11-05T18:33:24.080 回答
0

第二个答案(我不建议这样做,原因在我的第一个答案中给出)。在C你可以有:

int time1MinusTime2Positive(int t1, int t2) { // returns dt from 0 to <24 hours
    return fmod(t1 - t2 + 100 * 24 * 60 * 60, 24 * 60 * 60);
}

int time1MinusTime2(int t1, int t2) { // returns dt between -12 and +12 hours
    const int dt = t1 - t2;
    if (dt > 24 * 60 * 60 / 2)
       return dt - 24 * 60 * 60;
    else if (dt < -24 * 60 * 60 / 2)
       return dt + 24 * 60 * 60;
    else
       return dt;
}

在这里,输入时间表示为从午夜开始的秒数,或者从 1970 年开始的秒数,或者从 1900 年开始的秒数——这无关紧要。输出以秒为单位,相对于“当前”午夜,无论“当前”可能意味着什么。

于 2012-11-05T19:02:01.517 回答