【问题标题】:counting forward work out how long time a is after time b向前数算出a在时间b之后的时间
【发布时间】:2012-11-05 18:12:29
【问题描述】:

我需要一种方法来找出一个 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)

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

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

【问题讨论】:

  • 为什么不使用datetime.timedeltatime_b - time_a 将产生一个timedelta
  • 这适用于 datetime.datetime 对象,但不适用于 datetime.time 对象
  • @MartijnPieters 看起来假设是同一日期的时间......所以,不太确定预期的答案......
  • 是 09:00 - 10:00 = 1 小时还是 25 小时?那么最长是 24 小时吗?
  • 所以如果a = 09:00 和b = 10:00 那么ba 之后1 小时,但ab 之后23 小时,如果那样的话有道理

标签: python datetime


【解决方案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 上进行测试。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      根据我的经验,基本每当您从外部来源收到基于 24 小时的时间戳时,您应该立即在内部将其转换为绝对时间,例如从1970 年。例如,请参阅 Chttps://stackoverflow.com/a/12859648/318716 了解执行此操作的方法。

      一旦您这样做,那么简单的时间减法就变得简单有效。

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

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

      【讨论】:

      • 他的时差不应超过 23:59 小时...根据他的问题陈述
      • @JoranBeasley:也许我是盲人,但我在问题陈述中看不到这一点。如果是这样,那么这将不是一个现实世界的问题。但是,不幸的是,我也看到了许多不正确的“现实世界”解决方案。这对我建议的解决方案没有影响。
      • 时间确实不应该超过 23.59 appart 但我确实没有明确说明这一点
      【解决方案4】:

      第二个答案(我不建议这样做,原因在我的第一个答案中给出)。在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 年开始的秒数 - 没关系。输出以秒为单位,相对于“当前”午夜,无论“当前”可能意味着什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 2020-02-03
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多